我有一些带有TAB的CSV文件作为分隔符。这些行具有可变数量的列,我想将其标准化。
我需要确切地说10列,所以我要将空列添加到第10列,以防它的列数更少。
此外,我想循环文件夹中的所有文件并更新相应的文件,而不仅仅是输出或写入新文件。
我可以设法使用这样的逗号:
awk -F, '{$10=""}1' OFS=',' file.txt
但是当它更改为\t
时,我会中断并添加太多列:
awk -F, '{$10=""}1' OFS='\t' file.txt
任何输入?
答案 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
用于内联编辑并避免使用临时文件仅更改不符合要求的行的版本:
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来优化您的案例(最好应该是具有正态分布的平均缺失列)