合并重复的行并在末尾添加“N/A”

合并重复的行并在末尾添加“N/A”

我在文本文件中有以下几行。我想合并重复的行并根据需要在行末尾添加“N/A”,以便每行有六列:

302C21;tSMe
S123C;1.17
302C21;2;346;SM-1-3/SM-1-4
SIEV1;tSMe
S123C;3;2225;20225
SIEV1;1;3;SM-1-1/SM-1-2;5

OUTPUT

SIEV1;tSMe;1;3;SM-1-2;5
302C21;tSMe;2;346;SM-1-3/SM-1-4;N/A
S123C;3;2225;20225;1.17;N/A

答案1

{   nl   -s\; -w1 -ba    | 
    sort -t\; -k2,2      | 
    sed  -e:n -e'h;$!N'  \
         -e's/^\([^;]*\(;[^;]*;\).*\)\n[^;]*\2/\1;/;tn' \
         -ex  -e:N       \
         -e's/;/;/6p;tD' \
         -e's|$|;N/A|;tN'\
         -e:D -ex -eD    |
    sort -t\; -nk1,1     |
    cut  -d\; -f2-;    
}   <in >out

所以有一个巨大的管道。它的工作原理如下:

  1. nl对所有输入行进行编号,并在其行号后面插入插入的分号-s分隔符字符串;
  2. sort;对输入中的2cd 分号分隔字段进行排序- 这是您的第一个字段。
  3. sed递归地合并具有相同第一个字段的输入行,然后递归地附加字符串;N/A到每行的尾部,直到它至少有 6 个字段。
  4. sort再次对第一个字段进行排序,这次按数字排序 - 按 的nl原始计数顺序重新排列输入。
  5. cut删除最初由 插入的行号和分隔符nl

输出:

302C21;tSMe;2;346;SM-1-3/SM-1-4;N/A
S123C;1.17;3;2225;20225;N/A
SIEV1;tSMe;1;3;SM-1-1/SM-1-2;5

这些结果与您的不一样。看起来你的排序是反向的,而这些则不是。除非你澄清你在寻找什么,否则就这样吧。

PS 我是这样写的,如果它全部连接到一行上并不重要 - 所以你可以删除所有换行符和任何前面的反斜杠以使其成为单行。

就像这样:

{ nl -s\; -w1 -ba | sort -t\; -k2,2 | sed -e:n -e'h;$!N' -e's/^\([^;]*\(;[^;]*\;).*\)\n[^;]*\2/\1;/;tn' -ex -e:N -e's/;/;/6p;tD' -e's|$|;N/A|;tN' -e:D -ex -eD | sort -t\; -nk1,1 | cut -d\; -f2-; } <in >out

我无法想象你为什么要这么做。

相关内容