string - 使用 awk 对单词进行特定于行的重新排序

标签 string awk pattern-matching

假设一个多行文本文件具有两种交替类型的行。第一行以“>”开头,包含由下划线分隔的字母数字字符串。第二行由一个字母数字字符串组成。

$ 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/

相关文章:

Python 将字符串转换为列表(无 .split())

javascript - Node.js 获取字符串中所有出现的子字符串

bash - awk - 以 3 列格式打印输出

c# - 字符串中数字的正则表达式

Python 文本文件修剪冒号

java - 在java中设置静态对象

regex - 用于在文本文件中搜索列的正则表达式

bash - awk:使用 ANSI 转义序列进行字符串求反

f# - 缩短 F# 元组匹配

c# - C#7 中的 var 模式有什么好处?