在CSV文件中填充/填充缺少的列(使用选项卡)

时间:2015-04-15 07:26:41

标签: bash shell awk sed

我有一些带有TAB的CSV文件作为分隔符。这些行具有可变数量的列,我想将其标准化。

我需要确切地说10列,所以我要将空列添加到第10列,以防它的列数更少。

此外,我想循环文件夹中的所有文件并更新相应的文件,而不仅仅是输出或写入新文件。

我可以设法使用这样的逗号:

awk -F, '{$10=""}1' OFS=',' file.txt

但是当它更改为\t时,我会中断并添加太多列:

awk -F, '{$10=""}1' OFS='\t' file.txt

任何输入?

2 个答案:

答案 0 :(得分:3)

如果您有GNU awk,这将确保您有十列,如果已经存在,则不会删除第十列:

awk -F'\t' -v OFS='\t' '{NF=10}1' file >file.tmp && mv file.tmp file

Awk用户重视简洁性,并且可以进行JID建议的进一步简化。因为,在awk下,NF=10的计算结果为true,我们可以在导致打印行的同时将NF设置为10:

awk -F'\t' -v OFS='\t' 'NF=10' file >file.tmp && mv file.tmp file

答案 1 :(得分:0)

find /YourFolder -name "*.csv" -exec sed -i 's/$/\t\t\t\t\t\t\t\t\t/;s/^\(\([^\t]*\t\)\{9\}[^\t]*\).*/\1/' {} \;
  • find用于获取所有CSV文件
  • sed
    • -i用于内联编辑并避免使用临时文件
    • 在每一行上添加9个标签,然后只保留10个第一个元素(由9个标签分隔)

仅更改不符合要求的行的版本:

find /YourFolder -name "*.csv" -exec sed -i '/^\([^\t]*\t\)\{9\}[^\t]*$/ ! {
   s/$/\t\t\t\t\t\t\t\t\t/
   s/^\(\([^\t]*\t\)\{9\}[^\t]*\).*/\1/
   }' {} \;

自动调整列号

# change the 2 occurance of "9" by the number of wanted column - 1
find /YourFolder -name "*.csv" -exec sed -i ':cycle
/^\([^\t]*\t\)\{9\}[^\t]*$/ ! {
       # optimize with number ot \t on line below
       s/$/\t/
       s/^\(\([^\t]*\t\)\{9\}[^\t]*\).*/\1/
       b cycle
       }' {} \;
  • 您可以通过在每个周期中添加多个\t而不是1来优化您的案例(最好应该是具有正态分布的平均缺失列)