【发布时间】:2020-08-31 21:59:27
【问题描述】:
我在文件 karan.csv 中有 n 条记录,格式如下:
A=9607738162|B=9607562681|C=20200513191434|D=|F=959852599|G=MT|H=4012|I=4012|J=9607562681|K=947100410|
A=960299773008|B=9607793008|C=20200513191327|D=|E=ST|F=959852599|G=MO|H=2001|I=2001|J=9607793008|K=947100180|
A=9607704530|B=9607839496|C=20200513191730|D=|F=959852599|G=MT|I=5012|J=9607839496|K=|
现在,如果我们注意到,列数分别为:10、11 和 9。此计数在文件中是随机的,但列数将保持不变。
现在,我想创建一个脚本,如果一行中有 11 列,则从该列(包括分隔符)中删除 $5,使其看起来与 10 列的行完全相同
A=9607738162|B=9607562681|C=20200513191434|D=|F=959852599|G=MT|H=4012|I=4012|J=9607562681|K=947100410|
并且,添加“H=|”在 $7 中,列数为 9
A=9607704530|B=9607839496|C=20200513191730|D=|F=959852599|G=MT|H=|I=5012|J=9607839496|K=|
现在我写了以下代码来实现它:
for text in $(cat /tmp/karan.csv);do
count=`awk -F"|" '{print NF-1}' $text`
if [ $count == 9 ]
then
awk 'BEGIN{FS=OFS="|"}{$7="|H"}1' $text >> /tmp/karantest2.csv
elif [ $count == 10 ]
then
echo $text >> /tmp/karantest2.csv
else
awk -F"|" '{print $1,$2,$3,$4,$6,$7,$8,$9,$10,$11}' $text >> /tmp/karantest2.csv
fi
done
但在调试之后,我意识到脚本没有继续前进:
count=`awk -F"|" '{print NF-1}' $text`
任何人都可以取悦我吗?
问候
【问题讨论】:
-
变量
text在每次迭代中保存 CSV 文件的一行。你告诉 awk 这一行是要处理的文件的名称。当然,没有名称的文件。我原以为awk会发出错误消息,但我通过调用awk non-existent-file进行了尝试,确实,它没有抱怨,而是等待stdin 处理输入。 -
我同意你的看法@user1934428。但是有没有办法将 awk 用于像“$text”这样的变量而不是文件。