对文件进行排序,但将行对保持在一起

对文件进行排序,但将行对保持在一起

我有一个文件,其中包含结构条目

a1;b1;c1;
d1;e1;f1;g1
a2;b2;c2;
d2;e2;f2;g2

ETC。

我想通过 g 对该文件进行排序,但保留 abc 与相应的 g。有什么好的方法可以通过命令行执行此操作吗?我现在能想到的就是编写一个或多或少复杂的 perl 脚本。

答案1

如果您的行保证成对出现,第一行有 3 个字段,第二行有 4 个字段(并且第二行包含“g”值):

$ sed -n 'N;s/\n//;p' your_file \
   | sort -t';' -k7 \
   | perl -F';' -ane '$,=";";print @F[0..2],"\n";print @F[3..$#F]'

sed部分将每两个连续行连接在一起,sort对第七个字段上的输入进行排序;,最后将perl每行分成 2 部分:一个包含三个字段,一个包含四个字段。

答案2

假设数据结构相同,您可以使用 GNU sed 和 GNU awk 来完成此操作,例如:

# Separate records by an extra new-line
sed '2~2G' infile |

# Read records and use GNU awk's built-in sort on field 7
awk '
  BEGIN { PROCINFO["sorted_in"] = "@ind_str_desc" }
  { h[$7] = $0 }
  END { for(k in h) print h[k] }
' RS= FS='[;\n]+'

输出:

a2;b2;c2;
d2;e2;f2;g2
a1;b1;c1;
d1;e1;f1;g1

相关内容