Pad/Fill CSV 文件中缺少列(使用制表符)
Pad/Fill missing columns in CSV file (using tabs)
我有一些以 TAB 作为分隔符的 CSV 文件。这些行的列数可变,我想对其进行标准化。
我需要准确地说出 10 列,所以我想添加空列直到第 10 列,以防列数较少。
我还想循环一个文件夹中的所有文件并更新相应的文件,而不仅仅是输出或写入新文件。
我可以像这样用逗号做到这一点:
awk -F, '{=""}1' OFS=',' file.txt
但是当将其更改为 \t
时,我中断并添加了太多列:
awk -F, '{=""}1' OFS='\t' file.txt
有任何输入吗?
如果你有 GNU awk(有时称为 gawk
),这将确保你有十列,如果已经存在,它不会删除第十列:
awk -F'\t' -v OFS='\t' '{NF=10}1' file >file.tmp && mv file.tmp file
Awk 用户重视简洁性,并且可以按照 JID 的建议进一步简化。由于在 awk 下,NF=10
的计算结果为真,我们可以在打印行的同时将 NF
设置为 10:
awk -F'\t' -v OFS='\t' 'NF=10' file >file.tmp && mv file.tmp file
MacOS: 在 Mac 上,默认的 awk 是 BSD 但 GNU awk (gawk
) 可以使用 brew install gawk
.
安装
find /YourFolder -name "*.csv" -exec sed -i 's/$/\t\t\t\t\t\t\t\t\t/;s/^\(\([^\t]*\t\)\{9\}[^\t]*\).*//' {} \;
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]*\).*//
}' {} \;
自适应列号
# 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]*\).*//
b cycle
}' {} \;
- 您可以通过添加多个
\t
而不是每个周期添加 1 个来优化您的案例(最好是具有正态分布的平均缺失列)
我有一些以 TAB 作为分隔符的 CSV 文件。这些行的列数可变,我想对其进行标准化。
我需要准确地说出 10 列,所以我想添加空列直到第 10 列,以防列数较少。
我还想循环一个文件夹中的所有文件并更新相应的文件,而不仅仅是输出或写入新文件。
我可以像这样用逗号做到这一点:
awk -F, '{=""}1' OFS=',' file.txt
但是当将其更改为 \t
时,我中断并添加了太多列:
awk -F, '{=""}1' OFS='\t' file.txt
有任何输入吗?
如果你有 GNU awk(有时称为 gawk
),这将确保你有十列,如果已经存在,它不会删除第十列:
awk -F'\t' -v OFS='\t' '{NF=10}1' file >file.tmp && mv file.tmp file
Awk 用户重视简洁性,并且可以按照 JID 的建议进一步简化。由于在 awk 下,NF=10
的计算结果为真,我们可以在打印行的同时将 NF
设置为 10:
awk -F'\t' -v OFS='\t' 'NF=10' file >file.tmp && mv file.tmp file
MacOS: 在 Mac 上,默认的 awk 是 BSD 但 GNU awk (gawk
) 可以使用 brew install gawk
.
find /YourFolder -name "*.csv" -exec sed -i 's/$/\t\t\t\t\t\t\t\t\t/;s/^\(\([^\t]*\t\)\{9\}[^\t]*\).*//' {} \;
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]*\).*//
}' {} \;
自适应列号
# 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]*\).*//
b cycle
}' {} \;
- 您可以通过添加多个
\t
而不是每个周期添加 1 个来优化您的案例(最好是具有正态分布的平均缺失列)