awk拆分字段并将拆分放在文件末尾
尝试使用awk拆分字段并将拆分放在文件末尾,awk,Awk,尝试使用awk在-上拆分$1,并打印文件最后一列中的第四个值,中间有一个空选项卡。下面的命令确实执行,但只是按原样打印文件。谢谢:) 文件制表符分隔 Header1 Header2 Header3 Long Header4 Header5 Header6 00-0000-12345-xxx-yy_0 /path/to/file aaaaa 1111 00-0008-67899-yyy-zz_8 /path/to/file aaaaa 1111 Header1 Head
awk
在-
上拆分$1
,并打印文件
最后一列中的第四个值,中间有一个空选项卡。下面的命令确实执行,但只是按原样打印文件
。谢谢:)
文件制表符分隔
Header1 Header2 Header3 Long Header4 Header5 Header6
00-0000-12345-xxx-yy_0 /path/to/file aaaaa 1111
00-0008-67899-yyy-zz_8 /path/to/file aaaaa 1111
Header1 Header2 Header3 Long Header4 Header5 Header6
00-0000-12345-xxx-yy_0 /path/to/file aaaaa 1111 xxx
00-0008-67899-yyy-zz_8 /path/to/file aaaaa 1111 yyy
所需制表符分隔
Header1 Header2 Header3 Long Header4 Header5 Header6
00-0000-12345-xxx-yy_0 /path/to/file aaaaa 1111
00-0008-67899-yyy-zz_8 /path/to/file aaaaa 1111
Header1 Header2 Header3 Long Header4 Header5 Header6
00-0000-12345-xxx-yy_0 /path/to/file aaaaa 1111 xxx
00-0008-67899-yyy-zz_8 /path/to/file aaaaa 1111 yyy
awk
awk 'NR > 1; {split($1,a,"-"); a[4]} {a[4]=$NF","a[4]}1' OFS="\t" file
您可以使用
-
作为输入字段分隔符:
awk -F'-' 'NR==1{print; next} {print $0"\t"$4}' file
打印未修改的第一行,否则打印该行、制表符和第四个字段。使用GNU awk:
awk -F ' +|-' 'NR==1{print}; NR>1{print $0 "\t" $4}' file
输出:
Header1 Header2 Header3 Long Header4 Header5 Header6
00-0000-12345-xxx-yy_0 /path/to/file aaaaa 1111 xxx
00-0008-67899-yyy-zz_8 /path/to/file aaaaa 1111 yyy
头1头2头3长头4头5头6
00-0000-12345-xxx-yy_0/path/to/file aaaaaaa 1111 xxx
00-0008-67899-yyy-zz_8/path/to/file AAAA 1111 yyy
其他答案很好,也没什么大不了的,但这里有一个调整,因此您不需要两个单独的
print
语句:
$ awk -F'-' '{print $0 (NR>1 ? "\t" $4 : "")}' file
Header1 Header2 Header3 Long Header4 Header5 Header6
00-0000-12345-xxx-yy_0 /path/to/file aaaaa 1111 xxx
00-0008-67899-yyy-zz_8 /path/to/file aaaaa 1111 yyy
记录中的列数
$NF
基于当前行,而不是标题。此外,赋值类似于=
,因此您的a[4]=$NF
是向后的,如果这是固定的,它将覆盖您的1111
。相反,我认为您的目标是awk'BEGIN{OFS=FS=“\t”}NR==1;NR>1{split($1,a,“-”);print$0,a[4]}'
。然而,@Freddy在下面的回答是一个更简单的方法来实现这一点。这在任何awk中都是可行的,GNU对此没有具体的说明。