我有一个制表符分隔的文本文件,名为“data.txt”,看起来像
data.txt
col2 col3 col4 col1
val1 val5 val9 val13
val2 val6 val10 val14
val3 val7 val11 val15
val4 val8 val12 val16
...
有一个数组col_order = [col1, col2, col3, col4]
目标是使用shell脚本**根据数组“col_order”**中的顺序重新排列“data.txt”中的列。
最终输出
col1 col2 col3 col4
val13 val1 val5 val9
val14 val2 val6 val10
val15 val3 val7 val11
val16 val4 val8 val12
我目前的进度
awk 'BEGIN{ORS=RS="\n"; S=OFS="\t"}{for (i=1; i<=NF; i++) {f[$i] = i}{ print $(f["col1"]),$(f["col2"]),$(f["col3"]),$(f["col4"])}}' data.txt> data_corrected.txt
上面的语句按预期工作,但顺序是硬编码在语句中的,无法弄清楚如何从数组中获取顺序并将其传递到语句中。
我也愿意接受任何其他方法。
2条答案
按热度按时间vjrehmav1#
你能不能试一下。
输出如下。
EDIT by Ed Morton提供变量名称建议:
如果我只是为自己创建一个脚本,而不是使用这么多临时变量等来尽可能清楚地让其他人理解,那么我实际上是这样写的:
ygya80vv2#
这不是最终解决方案,而是PO代码的改进,其中列顺序不是硬编码的:
调用为