我有很多行,例如:
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
$2
uid
(如果文件中有其他行,这一行很有用。)
其他方式:
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