$ cat file1.txt
test 15 18 17
test1 11 12 14
test2 13 16 19
只需要提取
test 12 17 19
最好使用awk一行。
答案 0 :(得分:0)
你走了:
awk '{a=$1;c=$4;getline;b=$3;getline;d=$4;print a,b,c,d}'
test 12 17 19
您没有说明如何获得结果!!!
awk ' # start
{
a=$1 # from first line set a="test"
c=$4 # from first line set c=17
getline # get next line
b=$3 # from second line set b=12
getline # get next line
d=$4 # from third line set d=19
print a,b,c,d # print this
}' file
答案 1 :(得分:0)
将GNU awk用于数组数组(在任何具有略微不同语法和循环的awk中都可以类似):
$ awk '{a[NR][1]=""; split($0,a[NR])} END{print a[1][1], a[2][3], a[1][4], a[3][4]}' file
test 12 17 19
为了与发布的基于getline的解决方案进行比较,修改上述内容以便每次在行上出现“test”一词时将“found”打印到stderr,只需添加该条件和操作一次:
$ awk '{a[NR][1]=""; split($0,a[NR])} /test/{print "found" |"cat>&2"} END{print a[1][1], a[2][3], a[1][4], a[3][4]}' file
test 12 17 19
found
found
found
使用getline解决方案,您需要重复添加测试+操作,输入文件的每一行一次:
$ awk '{a=$1;c=$4;if (/test/)print "found" |"cat>&2";getline;b=$3;if (/test/)print "found" |"cat>&2";getline;d=$4;if (/test/)print "found" |"cat>&2";print a,b,c,d}' file
并考虑如果你的文件变成20行而不是3,你需要做什么。这是使用getline解决的100%不合适的问题。