我试图在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 , ,
任何帮助或更好的选择将不胜感激。预先感谢!
答案 0 :(得分:3)
您可以通过更改初始索引和增量值来修改其他所有元素
$ awk '/a/{for(i=2; i<=NF; i+=2) $i = $i " , ,"; print}' test.txt
a b , , c d , , e
i=2
和i+=2
可以避免手动检查字段是否为偶数。循环迭代将是2,4,6等,而不是1,2,3,4等$i = $i " , ,"
将给定的字符串附加到字段print
将使用OFS(输出字段分隔符)作为连接字段的字符串来打印$0
的内容(默认OFS为单个空格字符)
在尝试中,您希望在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