根据文件中行的可变长度添加和删除列的脚本

Script to add and remove columns depending on the variable length of the line in a file

我在文件 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|

并且,在列数为 9

的 $7 中添加 "H=|"
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="|"}{="|H"}1' $text >> /tmp/karantest2.csv
  elif [ $count == 10 ]
  then
  echo $text >> /tmp/karantest2.csv
  else
  awk -F"|" '{print ,,,,,,,,,}' $text >> /tmp/karantest2.csv
  fi
  done

但是在调试之后,我意识到脚本在以下之后没有继续前进:

count=`awk -F"|" '{print NF-1}' $text`

有谁能就此取悦我吗?

此致

一个 sed 解决方案,首先在 9 列的行上插入 H=|,然后在 11 列的行上删除第 7 列:

sed -E '/^([^\|]+\|){9}$/s/(([^\|]+\|){6})/H=\|/;/^([^\|]+\|){11}$/s/(([^\|]+\|){4})[^\|]+\|// inputfile

如果您需要符合 POSIX 的命令,那么

  • 因为 -E 不是 POSIX,你必须转义每个 (){}+(和其他不在此命令中的特殊字符),并取消转义 \| 使其成为文字;
  • 因为 \+ 也不是 POSIX,你需要使用更详细的 \{1,\}.

这是符合 POSIX 的命令:

sed '/^\([^|]\{1,\}|\)\{9\}$/s/\(\([^|]\{1,\}|\)\{6\}\)/H=|/;/^\([^|]\{1,\}|\)\{11\}$/s/\(\([^|]\{1,\}|\)\{4\}\)[^|]\{1,\}|//' inputfile

awk解决方案:

awk -F'|' '

BEGIN { OFS="|" }

NF==10 { print , , , , , , "H=", , , ,  }
NF==11 { print [=10=] }
NF==12 { print , , , , , , , , , ,  }

' karen.csv

所提供示例输入的输出是:

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=|F=959852599|G=MO|H=2001|I=2001|J=9607793008|K=947100180|
A=9607704530|B=9607839496|C=20200513191730|D=|F=959852599|G=MT|H=|I=5012|J=9607839496|K=|