如果 E 或 F 列为空或值为 0,则复制 B 列

如果 E 或 F 列为空或值为 0,则复制 B 列

我有一个 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

相关内容