假设一个多行文本文件具有两种交替类型的行。第一行以“>”开头,包含由下划线分隔的字母数字字符串。第二行由一个字母数字字符串组成。
$ cat file
>foo_bar_baz1
abcdefghijklmnopqrstuvwxyz0123456789
>foo_bar_baz2
abcdefghijklmnopqrstuvwxyz0123456789
>foo_bar_baz3
abcdefghijklmnopqrstuvwxyz0123456789
我想更改以“>”开头的行中的单词顺序。
$ cat file | sought_command
>baz1_foo_bar
abcdefghijklmnopqrstuvwxyz0123456789
>baz2_foo_bar
abcdefghijklmnopqrstuvwxyz0123456789
>baz3_foo_bar
abcdefghijklmnopqrstuvwxyz0123456789
我知道这个任务可以使用 awk 来完成。
我需要如何更改下面的 awk 代码草案才能实现我的目标?在当前形式中,以下代码仅打印以“>”开头的行,而不打印那些没有的行。
awk -F'_' '$1 ~ /^>/ { print ">"$3"_"$1"_"$2}' file | sed 's/>foo/foo/'
>baz1_foo_bar
>baz2_foo_bar
>baz3_foo_bar
最佳答案
这是一种方法。 1
将打印所有行,而仅修改所需的行:
$ awk -F'_' '$1 ~ /^>/ {$0 = ">"$3"_"$1"_"$2}1' file | sed 's/>foo/foo/'
>baz1_foo_bar
abcdefghijklmnopqrstuvwxyz0123456789
>baz2_foo_bar
abcdefghijklmnopqrstuvwxyz0123456789
>baz3_foo_bar
abcdefghijklmnopqrstuvwxyz0123456789
您可能更喜欢使用 substr 而不是通过管道传输到 sed:
$ awk -F'_' '$1 ~ /^>/ { $0 = ">" $3 "_" substr($1,2) "_" $2}1' file
>baz1_foo_bar
abcdefghijklmnopqrstuvwxyz0123456789
>baz2_foo_bar
abcdefghijklmnopqrstuvwxyz0123456789
>baz3_foo_bar
abcdefghijklmnopqrstuvwxyz0123456789
关于string - 使用 awk 对单词进行特定于行的重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50250682/