awk(或其他)如何强制字段编号保持不变?

时间:2015-02-19 23:16:36

标签: bash awk

我有一个包含以下行的输入文件:

A;B;C;D;E;F;G;H;I
1;3312;14.025538;14.617777;0.;0.000000001;253.777023;3.232552;52487.
2;3312;13.206808;13.779518;0.;260.078461;258.954529;3.154804;52487.
3;3312;13.054019;13.491556;0.;256.126221;251.776566;3.247191;52487.
4;3312;12.556334;13.061086;0.;255.570862;254.689224;3.190753;52487.
5;3312;11.719666;11.96375;0.;100.0546;254.258652;3.220166;52487.

我需要始终根据A,C,D和F读取字段,在这种情况下,$ 1,$ 3,$ 4和$ 6。所以awk很简单:

awk -F";" '{print $1, $3, $4, $6}' input.txt

但是,如果字母的顺序不同,如何获得相同的结果?例如,顺序是(我只是打印第一行,但下一行的位置也会不同):

A;I;E;H;G;F;C;D;B

我仍然需要总是根据A,C,D和F读取字段,但现在它们分别是1美元,9美元,8美元和6美元。它们可能会再次发生变化,从输入文件到输入文件。

有没有办法根据A,C,D和F对字段进行排序,无论他们的顺序如何,而且忽略所有其他字段,所以我总会有类似下面的内容:

A;C;D;E
1;14.025538;14.617777;0.000000001
2;13.206808;13.779518;260.078461
3;13.054019;13.491556;256.126221
4;12.556334;13.061086;255.570862
5;11.719666;11.96375;100.0546

1 个答案:

答案 0 :(得分:6)

$ awk -F\; -vOFS=\; 'NR==1 {for (i=1; i<=NF; i++) h[$i]=i} {print $h["A"], $h["C"], $h["D"], $h["F"]}'

在输入的第一行,记录从所有列标题到其索引的映射 之后,在所有规则中,按标题名称而不是索引来引用字段。