我有 10 个字段,我想从字段 5 开始到字段 10,并忽略前 5 个字段。如何在 awk 中使用 NF 来实现这一点?
f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10
我只想显示:
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
答案1
您需要循环遍历这些字段:
bash-4.3$ awk '{for(i=6;i<=NF;i++) printf $i" "; print ""}' input_file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
或者您可以使字段等于空字符串:
bash-4.3$ awk '{for(i=1;i<=5;i++) $i="";print}' input_file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
或者使用整行的子字符串,打印从字段 6 开始的所有字符(归功于https://stackoverflow.com/a/12900372/3701431):
bash-4.3$ awk '{print substr($0,index($0,$6))}' input_file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
或者直接使用cut
命令:
bash-4.3$ cut -d " " -f6-10 input_file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
Python 也可以做到这一点:
bash-4.3$ python -c 'import sys;fields=[" ".join(line.strip().split()[5:]) for line in sys.stdin];print "\n".join(fields)' < input_file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
或者:
$ python -c "import sys;print '\n'.join(map(lambda x:' '.join(x.split()[5:]),sys.stdin.readlines()))" < input_file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
或者使用 Ruby:
bash-4.3$ ruby -ne 'print $_.split()[5..10].join(" ");print "\n"' < input_file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
Bash + xargs 也可以做到这一点,尽管有点复杂:
bash-4.3$ cat input_file.txt | xargs -L 1 bash -c 'arr=($@);for i in $(seq 5 10);do printf "%s " ${arr[$i]} ; done; echo' sh
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
答案2
只需处理感兴趣的字段。这将是最后一个字段 -4、最后一个字段 -3,直到实际的最后一个字段。
读取包含此内容的文件(文件.txt):
f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10
按照如下所述对文件运行 awk。带符号的行$
是命令。最后两行是输出。
$ awk '{print $(NF-4)" "$(NF-3)" "$(NF-2)" "$(NF-1)" "$NF}' file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
笔记:正如 Cyrus 在评论中指出的那样,我删除了 bash 脚本,只留下了打印语句,以使其更简单、更快。