我在文本文件中有以下几行。我想合并重复的行并根据需要在行尾添加“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
Run Code Online (Sandbox Code Playgroud)
{ 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
Run Code Online (Sandbox Code Playgroud)
所以有一个巨大的管道。它是这样工作的:
nl对所有输入行进行编号,并在其行号-s后面插入一个;分号分隔符字符串。sort;在其输入中的 2cd分号分隔字段上排序- 这是您的第一个字段。sed递归合并具有相同第一个字段的输入行,然后递归地将字符串附加;N/A到每行的尾部,直到它至少有 6 个字段。sort这次在第一个字段上再次排序,并按数字排序 - 按nl的原始计数顺序重新排列输入。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
Run Code Online (Sandbox Code Playgroud)
这些结果与您的不同。看起来你的排序是相反的,而这些不是。除非你澄清你在找什么,否则你去吧。
PS 我写这个的方式是,它是否全部连接到一行都无关紧要 - 因此您可以删除所有换行符和任何前面的反斜杠以使其成为单行。
像这样:
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
Run Code Online (Sandbox Code Playgroud)
我无法想象为什么你会想要这样做。