2

我有一个制表符分隔的文件,其中第 1 列是 0 或 16。如果第 1 列有 16,那么我需要将第 2 列和第 3 列平行移动到第 2 列和第 3 列,其中第一列有 0。下面是一个示例。

0 69 24
0 69 27
16 55 27
0 85 25
16 77 23

0 69 24 55 27
0 69 27 77 23
0 85 25

我想这可以用 来完成awk,将不胜感激。谢谢

4

3 回答 3

3

这应该有效:

awk '
BEGIN{FS=OFS="\t"}
$1==0{zero[++i]=$0;next}
{notzero[++y]=$2"\t"$3}
END{for(c=1;c<NR;c++) print zero[c],notzero[c]}' file

测试:

$ cat file
0   69  24
0   69  27
16  55  27
0   85  25
16  77  23
[JS웃:~/Temp]$ awk 'BEGIN{FS=OFS="\t"}$1==0{zero[++i]=$0;next}{notzero[++y]=$2"\t"$3}END{for(c=1;c<NR;c++) print zero[c],notzero[c]}' file
0   69  24  55  27
0   69  27  77  23
0   85  25  
于 2013-06-24T16:26:54.950 回答
2

使用 Perl:

perl -lane '{!$F[0]&&push(@h,$_)||print(shift @h," $F[1] $F[2]")}
    END{print for @h}' input
于 2013-06-24T21:00:48.307 回答
2

GNU 的代码:

sed -nr '/0\s/{H;${x;s/\`\n(.*)/\1/mp};d};/16\s/s/16\s(.*)/\1/;H;g;s/\`\n(.*)\n.*\n(.*)\'/\1 \2/p;g;s/\`\n(.*)(\n.*)\n(.*)\'/\2/;h;${s/\`\n(.*)/\1/mp};d' file

$猫文件
0 69 24
0 69 27
16 55 27
0 85 25
16 77 23

$sed -nr '/0\s/{H;${x;s/\`\n(.*)/\1/mp};d};/16\s/s/16\s(.* )/\1/;H;g;s/\`\n(.*)\n.*\n(.*)\'/\1 \2/p;g;s/\`\n(. *)(\n.*)\n(.*)\'/\2/;h;${s/\`\n(.*)/\1/mp};d' 文件
0 69 24 55 27
0 69 27 77 23
0 85 25
于 2013-06-24T20:50:34.583 回答