-4
$ cat file1.txt
test 15 18 17
test1 11 12 14
test2 13 16 19

只需提取

test 12 17 19

最好使用 awk 一行。

4

2 回答 2

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
于 2013-10-14T07:27:02.297 回答
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 解决方案,您需要重复添加 test+action,输入文件的每一行一次:

$ 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 行,您需要做什么。这 100% 不适合使用 getline 解决。

于 2013-10-14T13:38:30.020 回答