【问题标题】:Replace by removing new line character using AWK in shell?通过在 shell 中使用 AWK 删除换行符来替换?
【发布时间】:2016-11-13 18:02:17
【问题描述】:

我有一个文件:

a.txt

f1,f2,f3
a,b,c
d,e,f
g,h,i

我想通过删除 f3 中的换行符来连接 f2 和 f3 [即。 f2=f2.f3]并更新文件。我尝试了下面的命令,但也插入了换行符。如何删除该部分?

awk -F "," -v OFS=, '{$2 = $2$3;print}' abc.txt > abc.tmp && mv abc.tmp abc.txt

【问题讨论】:

  • $3 不能包含换行符。 awk 'BEGIN{FS=OFS=","} {$2 = $2$3} 1' a.txt 的输出是什么?
  • a,bc^M,c d,ef^M,f g,hi^M,i 我得到了 ^M 字符

标签: shell awk


【解决方案1】:

这是由于行尾存在 DOS 换行符\r

您可以将此 gnu awk 命令与 RS 一起使用为 \r\n 来处理:

awk -v RS='\r\n' 'BEGIN{FS=OFS=","} NR>1{$2 = $2$3} 1' a.txt

f1,f2f3,f3
a,bc,c
d,ef,f
g,hi,i

或者,您可以在使用常规 awk 命令之前运行 dos2unix 命令:

dos2unix a.txt
awk 'BEGIN{FS=OFS=","} NR>1{$2 = $2$3} 1' a.txt

【讨论】:

  • 这个命令有问题,输出头会变成“f2f3”。但我要求标题为 f2 。因为它只是应该连接的值
  • @tester 将{$2 = $2$3} 替换为NR>1 {$2 = $2$3}。此外,您可以使用sub(/\r/,"",NF) 删除\r
  • @tester:谢谢詹姆斯。您只需要一个条件 NR>1 即可对第 2 行及以后的行进行此更改。检查我更新的答案。
猜你喜欢
  • 2019-03-29
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 2018-01-21
  • 2016-10-29
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
相关资源
最近更新 更多