linux - 使用 awk 清理 csv 文件的标题

标签 linux bash shell csv awk

我有一堆看起来像这样的 csv 文件:

Time,Channel A
(s),(V)

0.00000000,0.58058560
0.00666667,0.58913630
0.01333334,0.58058560

我想将其转换为:

Time (s),Channel A (V)
0.00000000,0.58058560
0.00666667,0.58913630
0.01333334,0.58058560

文件中的单位不一定相同(即可能有 (ms),(µV) 等)

我用 awk 'FNR!=3' 删除了空白行(始终是第 3 行),但删除了第二行参数并将它们粘贴到第一行字段后面超出了我的能力;(

请帮帮我! 动机:有很多这样的文件。手工做是不可行的......

编辑: 首先:感谢您帮助我。由于您的两个答案似乎存在相同的问题,我的文件中可能存在问题?我怀疑空行会以某种方式引起麻烦?

  • shell 脚本给我错误 'xpected empty line, read '
  • perl 脚本awk 脚本给我错误的第一行:

     (V) (s),Channel A
    0.00000000,0.58058560
    

如果有帮助,I uploaded a sample infile .

最佳答案

awk -F , -v RS='\r\n' 'FNR == 1 { x = $1; y = $2 } FNR == 2 { print x " " $1 "," y " " $2 } FNR > 3'

简要说明:awk 接受逻辑表达式作为范围模式(范围内的任何内容都可以使用,)因此 FNR == n 意味着该模式适用于行当前文件中的编号n;最后一个模式适用于第 3 行 之后的所有内容;省略操作意味着简单地将输入打印为已读。因此,第 1 行和第 2 行被特殊对待,每行都根据自己的含义进行处理,第 3 行被忽略,因为没有匹配的模式。

更新:根据@123 的建议编辑设置RS(记录分隔符)。另一种方法是将它包含在脚本本身中,可能连同 FS(字段分隔符),如下所示:

awk 'BEGIN { FS=","; RS="\r\n" } FNR == 1 { x = $1; y = $2 } FNR == 2 { print x " " $1 "," y " " $2 } FNR > 3'

关于linux - 使用 awk 清理 csv 文件的标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44349394/

相关文章:

linux - 删除shell中一行的最后一个字

linux - 使用管道一次性完成 Tar 和 Rsync

javascript - Nodejs child_process执行shell命令

c - 使用库函数存储值时结构中的变量损坏

正则表达式,选择以我的条件开头的行,但只取空格后的字符

mysql - bash 从 bash 命令更新 mysql

node.js - Gitlab-ci 脚本和 ssh 中的 Nvm

linux - 是否有可能在 linux 中找到包含特定文本的文件?

linux - 如何将 Perl 数据转换为 PDF?

linux - 什么内置变量告诉你 cmake ExternalProject url tar.gz 文件被提取到哪里?