我有一个 CSV 文件,我想使用 bash 和 awk 命令或其他命令来修改该文件。
例如,如果 E 或 F 列为空或值为 0,我想复制 B 列
AAAA, BBBB, CCCC, DDDD, EEEE, FFFF
11 12 13 14 15 0
输出:
AAAA, BBBB, CCCC, DDDD, EEEE, FFFF
11 12 13 14 15 12
我怎样才能做到这一点?
更新:我运行 cat user.csv 并显示了这个
740.58,0,740.58,0,740.58
2452.84,0,2452.84,0,2452.84
898.23,0,898.23,0,898.23
227.57,0,227.57,0,227.57
735.02,0,735.02,0,735.02
640.5,0,640.5,0,640.5
469.31,0,469.31,0,469.31
3744.25,0,3744.25,0,3744.25
462.15,0,462.15,0,462.15
198.79,0,198.79,0,198.79
437.58,0,437.58,0,437.58
515.44,0,515.44,0,515.44
这就是它在 LibreOffice 上的样子
所以我想做的是将 C 列的信息替换为 B 列,如果 B 列上的所有信息都有 0,如果不是 0,则不改变任何内容,我自己解释过?
抱歉我的英语不太好:c
更新:如果声明如下:
如果 [[ $2 == 0 ]];然后 echo "将第 3 列复制到第 2 列" awk -F , 'BEGIN { OFS = FS } $2 == 0 { $2 = $3 }; 1' user.csv > user1.csv else if [[ $4 == 0 ]];然后 echo "将第 5 列复制到 4" awk -F , 'BEGIN { OFS = FS } $4 == 0 { $4 = $5 }; 1' user.csv > user1.csv fi fi
答案1
gawk '
BEGIN {FS = OFS = "\t"}
!$5 {$5 = $2}
!$6 {$6 = $2}
1
' input.tsv
如果输出看起来正确,请重新执行gawk -i inplace '...' input.tsv
答案2
$ awk -F , 'BEGIN { OFS = FS } $2 == 0 { $2 = $3 }; 1' user.csv
740.58,740.58,740.58,0,740.58
2452.84,2452.84,2452.84,0,2452.84
898.23,898.23,898.23,0,898.23
227.57,227.57,227.57,0,227.57
735.02,735.02,735.02,0,735.02
640.5,640.5,640.5,0,640.5
469.31,469.31,469.31,0,469.31
3744.25,3744.25,3744.25,0,3744.25
462.15,462.15,462.15,0,462.15
198.79,198.79,198.79,0,198.79
437.58,437.58,437.58,0,437.58
515.44,515.44,515.44,0,515.44
awk
如果第二个字段的数值为零,则这用于将每个记录(行)的第二个字段(列)设置为第三个字段的值。
该BEGIN
块只是将输出字段分隔符设置为输入字段分隔符(它是一个逗号,在命令行上使用 进行设置-F
)。
尾部1
与 相同{ print }
,这会导致无条件打印每条记录。
关于您对问题的更新:如果您想在第 2 列为零的情况下将第 3 列复制到第 2 列(如上所述),并且同时在第 4 列为零的情况下将第 5 列复制到第 4 列,则上面的代码很容易像这样扩展:
awk -F , 'BEGIN { OFS = FS }
$2 == 0 { $2 = $3 }
$4 == 0 { $4 = $5 }; 1' user.csv