使用 awk 插入行

Insert rows using awk

如何使用 awk 插入一行?

我的文件看起来像:

1       43
2       34
3       65
4       75

我想用“?”插入三行所以我的愿望文件看起来是:

1       ?
2       ?
3       ?
4       43
5       34
6       65
7       75

我正在尝试使用以下脚本。

awk '{if(NR<=3){print "NR        ?"}} {printf" " NR      }' file.txt
$ awk 'BEGIN {printf "1 ?\n2 ?\n3 ?\n"} {printf "%d",  + 3; printf " %s\n", }' file.txt
1 ?
2 ?
3 ?
4 43
5 34
6 65
7 75

这是一种方法:

$ awk 'BEGIN{s="       "; for(c=1; c<4; c++) print c s "?"}
       {print c s ; c++}' ip.txt 
1       ?
2       ?
3       ?
4       43
5       34
6       65
7       75

你也可以在awk前加上3行,例如:

{ seq 3; cat file.txt; } | awk 'NR <= 3 {  = "?" }  = NR' OFS='\t'

输出:

1       ?
2       ?
3       ?
4       43
5       34
6       65
7       75

我会按照使用 GNU AWK 的方式进行操作,令 file.txt 内容为

1       43
2       34
3       65
4       75

然后

awk 'BEGIN{OFS="       "}NR==1{print 1,"?";print 2,"?";print 3,"?"}{print NR+3,}' file.txt

输出

1       ?
2       ?
3       ?
4       43
5       34
6       65
7       75

说明:我将输出字段分隔符 (OFS) 设置为 7 个空格。对于第一行,我确实打印了三行,其中包含后续数字和由输出字段分隔符剪切的 ? 。您可以选择使用 for 循环来执行此操作,特别是如果您预计此处的要求可能会发生变化。对于每一行,我打印行数加 4(以保持顺序)和第二列(</code>)。由于使用 OFS,如果有关车位数量的要求将发生变化,您只需进行一项更改。请注意构造 like</p> <pre><code>{if(condition){dosomething}}

可以更简洁地写成GNU AWK,如

(condition){dosomething}

(在 gawk 4.2.1 中测试)