linux - 如何使用 awk 在 .csv 文件的前两行之后覆盖而不删除它们,并在预告片之前停止覆盖?

标签 linux bash shell awk

我正在使用这个 awk 命令:

 awk -F',' -v OFS=',' '{gsub(/"/, "", $5); $5 = sprintf("%010s", $5);sub($5, "\"&\"");print}' Test_File > tmp && mv tmp Test_File

它删除第 5 列周围的双引号,将该列的数据零填充为 10,在对第 5 列进行零填充后将引号添加回去,然后覆盖现有文件。

但是,此命令也对标题和尾部执行上述所有操作,我想保留标题和尾部的原样,而只覆盖正文。

这是初始的 Test_File 数据:

Header 1, data, data, data, data, data
Header 2, data, data, data, data, data
column 1, column 2,column 3, column 4, column 5, column 6
1,2,3,4,"000005",6
1,2,3,4,"005", 6
Trailer

这是我当前的 awk 命令对 Test_File 数据所做的,它不起作用:

Header 1, data, data, data, "000000data", data
Header 2, data, data, data, "000000data", data
column 1, column 2,column 3, column 4, "00column 5", column 6
1,2,3,4,"0000000005",6
1,2,3,4,"0000000005",6
Trailer, data, data, data, "000000data", data

在将我的 awk 脚本应用于 Test_File 数据后,这是我想要的:

Header 1, data, data, data, data, data
Header 2, data, data, data, data, data
column 1, column 2,column 3, column 4, column 5, column 6
1,2,3,4,"0000000005",6
1,2,3,4,"0000000005",6
Trailer, data, data, data, data, data

请协助。

最佳答案

我正在考虑您的第一列有字符串 headertrailer 并且您不想在其中编辑任何内容,所以稍微调整一下您的代码,尝试以下.

awk -F',' -v OFS=',' '$1!~/Header/ && $1!~/Trailer/ && $1!~/column/{gsub(/"/,"", $5); $5 = sprintf("%010s", $5);sub($5, "\"&\"");print;next} 1' Input_file  > temp_file && mv temp_file  Input_file

输出如下。

Header 1, data, data, data, data, data
Header 2, data, data, data, data, data
column 1, column 2,column 3, column 4, column 5, column 6
1,2,3,4,"0000000005",6
1,2,3,4,"0000000005", 6
Trailer, data, data, data, "000000data", data

关于linux - 如何使用 awk 在 .csv 文件的前两行之后覆盖而不删除它们,并在预告片之前停止覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51860334/

相关文章:

linux - 能不能不安装直接复制curl包在linux上运行

linux - 如何在shell中加入多个进程?

运行守护进程脚本的 Java Execute Bash 脚本

bash - 如何将包含斜杠的变量传递给 sed

linux - 为什么位置参数 $1 具有不同的值?

linux - 如何显示空磁盘空间

Bash 确认不会等待用户输入

shell - 仅当它们匹配模式时才删除重复的行

linux - 将第一列与第二列进行比较,并在 shell 脚本的第二列中取出不是唯一的值

linux - 无法为 ctypes 设置环境变量(python 的 c 库)