AWK-仅在特定列中替换一个字符


13

我有一个像这样的文件:

2018.01.02;1.5;comment 1
2018.01.04;2.75;comment 2
2018.01.07;5.25;comment 4
2018.01.09;1.25;comment 7

我想.用逗号替换第二列中的所有点,,就像我将sed 's/\./\,/g' file如何使用sed或最好awk仅将其应用于第二列一样,所以我的输出应如下所示:

2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7

Answers:


22
$ awk 'BEGIN{FS=OFS=";"} {gsub(/\./, ",", $2)} 1' ip.txt
2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7
  • BEGIN{} 该代码块将在处理任何输入行之前执行
  • FS=OFS=";" 将输入和输出字段分隔符设置为 ;
  • gsub(/\./, ",", $2)对于每个输入行,将.第二个字段中的所有替换为,
  • 1是awk习语,用于打印的内容$0(包含输入记录)

1
太棒了!
19th

9
sed 's/\./,/3' file

替换点的第三次出现


2
另一个Useles使用cat...为什么不只是sed 's/\./,/3' file?(此外,逗号也不必转义。)
twalberg

我考虑到了观察结果
Emilio Galarraga,

cat在这里不一定没用。它将允许该操作使用2个内核。
罗恩

@ronrothman cat除了耗尽资源外,核心运行的目的是什么?也许提供一点缓冲,但随后这个意图应该像一个工具,可以更好地表达buffercat
罗兰·伊利格

为了使(阻塞)磁盘读取与字符串替换解耦。是的,我想您可以将其视为缓冲。
罗恩·罗斯曼

4

使用awk通过以下方法完成

命令: awk -F ";" '{gsub(/\./,",",$2);print $1";"$2";"$3}' filename

输出

2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.