awk 脚本扫描文件中的某些单词并创建输出

awk 脚本扫描文件中的某些单词并创建输出

我有很多行,例如:

uid: jdoes mail:  [email protected]
mail:  [email protected] uid: mdoes
uid: kdoes mail:  [email protected]
mail:  [email protected] uid: tdoes

我如何重新排列它们,使其看起来像:

uid: jdoes mail:  [email protected]
uid: mdoes mail:  [email protected]
uid: kdoes mail:  [email protected]
uid: tdoes mail:  [email protected]

答案1

AWK 的核心是对匹配某些内容的行执行某些操作。您有两种类型的行,因此每种类型都匹配,并以不同的方式打印。一种方法是:

awk '/^uid/ { print } /^mail/ { print $3" "$4" "$1"  "$2 }' <your files>

它是如何工作的:

  • 对于以它开头的行,uid按其显示方式打印它们;
  • 对于以它开头的行,以不同的方式排列列(请注意和mail之间的额外空格,因为它位于行中)。$1$2uid

(如果文件中有其他行,这一行很有用。)


其他方式:

awk '/^mail/{$0=$3" "$4" "$1" "$2};1' <your files>

它是如何工作的:

  • print默认情况下打印$0(整行);
  • ;1相当于; { print }
  • 我们改变$0线路匹配^mail

(如果你想处理和打印,这个可能会更快文件中的所有行。谢谢唐克里斯斯蒂。)

答案2

任务可以轻松完成sed

sed 's/^\(mail:\s*\S*\)\s*\(.*\)/\2 \1/' file.lines

要成为 POSIX,您应该更改\s[[:blank:]]\S[^[:blank:]]

sed 's/^\(mail:[^:]*\)[[:blank:]]\(.*\)/\2 \1/' file.lines

相关内容