使用awk

时间:2018-06-19 12:41:31

标签: awk delimiter

我试图在2的倍数之间插入两个逗号。例如,对于以下输入文件,我试图在b和c&d与e列之间打印2个逗号:-

a b c d e
f g h i j
k l m n o

输出应如下所示:-

a b , , c d , , e

以下代码是我到目前为止所拥有的。请注意,我也有模式匹配,因此是/a/。我使用了for循环来打印带有if语句的逗号,该语句应该每两列打印两个逗号,这是模的用途:-:-

awk '/a/{for (i = 1; i <= NF; i++) printf $i" "; if ((i%2)==0) printf " , ,"}' test.txt > blabla.txt

结果如下。我的for循环和模式匹配工作正常,但由于某些原因,if语句未执行,我不知道为什么:-

a b c d e , ,

任何帮助或更好的选择将不胜感激。预先感谢!

2 个答案:

答案 0 :(得分:3)

您可以通过更改初始索引和增量值来修改其他所有元素

$ awk '/a/{for(i=2; i<=NF; i+=2) $i = $i " , ,"; print}' test.txt
a b , , c d , , e
  • 具有i=2i+=2可以避免手动检查字段是否为偶数。循环迭代将是2,4,6等,而不是1,2,3,4等
  • $i = $i " , ,"将给定的字符串附加到字段
  • print将使用OFS(输出字段分隔符)作为连接字段的字符串来打印$0的内容(默认OFS为单个空格字符)
  • 更多阅读内容:gawk manual - Changing the Contents of a Field


在尝试中,您希望在for循环中包含多个语句。为此,您需要将它们放在{}

$ awk '/a/{for (i = 1; i <= NF; i++) printf $i" "; if ((i%2)==0) printf " , ,"}' ip.txt
a b c d e  , ,

$ awk '/a/{for (i = 1; i <= NF; i++) { printf $i" "; if ((i%2)==0) printf " , ," } }' ip.txt
a b  , ,c d  , ,e 

但这仍然效率不高-除了第二个逗号后缺少空格外,最后一列之后还有多余的空间。而且也没有换行符,这可能是一个问题

答案 1 :(得分:1)

此sed单线可能有帮助:

 sed -r 's/\s\S\s/&, , /g' file

仅行替换包含a

sed -r '/a/s/\s\S\s/&, , /g' file

例如:

kent$  sed -r 's/\s\S\s/&, , /g' <<<"a b c d e"
a b , , c d , , e