Mis*_*san 5 grep sed awk text-processing gawk
我有一个示例,如下所示:
输入文件
USERS position ref rslt
usr1 X B
usr2 2980 C
usr3 3323 P
usr4 A
usr5 5251 U
usr6 9990 A
usr7 10345 T
Run Code Online (Sandbox Code Playgroud)
我需要打印“rslt”列和相应的“USERS”,输出文件应该是这样的:
输出.txt
USERS rslt
usr1 B
usr2 C
usr4 A
usr6 A
Run Code Online (Sandbox Code Playgroud)
我尝试使用awk
命令,但没有用。请注意,表格的所有黑色位置都填充了空格(每行空格数不同)
JJo*_*oao 12
在这种情况下,一种可能的解决方案是在开始部分提供字段的宽度:
awk 'BEGIN {FIELDWIDTHS = "16 11 6 7"}
$4 ~/[^ ]/ {print $1 $4}'
Run Code Online (Sandbox Code Playgroud)
字段宽度可以手动计算,但对于复杂的标题,我喜欢从
head -1 f | grep -Po '.*? (?=\S|$)' | awk '{print length}'
Run Code Online (Sandbox Code Playgroud)
更新:...或为了处理标题中的初始和最终空格:
head -1 f | grep -Po '(^ *|\S).*?( (?=\S)|$)' | awk '{print length}'
Run Code Online (Sandbox Code Playgroud)
该AWK命令是不是这个事情最合适的工具。使用cut,它将要提取的字段的字符位置作为参数。因此,在您的示例中,指定USERS
从字符位置 1 开始,以字符位置 8 结束,rslt
从字符位置 33 开始。
$ cut -c 1-8,33- input.txt 用户名 用户1B 用户2 C 用户3 用户4 用户5 usr6A 用户7
有关如何计算字符位置的信息,请参阅以下内容。
1 2 3 123456789012345678901234567890123456789 用户位置参考 usr1 XB usr2 2980 C usr3 3323 P 用户4 usr5 5251 U usr6 9990 A usr7 10345吨