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

抽出するだけでよい

test 12 17 19

awk 1行を使用することをお勧めします。

4

2 に答える 2

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 に出力するように上記を変更するには、その条件とアクションを 1 回追加するだけです。

$ 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 ソリューションでは、入力ファイルの行ごとに 1 回、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

また、ファイルが 3 行ではなく 20 行になった場合に何をする必要があるかを検討してください。これは、getline を使用して解決するのに 100% 適切な問題ではありません。

于 2013-10-14T13:38:30.020 に答える
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 に答える