有没有更好的方法(例如 AWK 中的单行)可以获取带有列名标题的表中的列号?我希望能够独立于列号的实际值来处理列(例如,当添加另一列时,脚本不需要更改)。
例如,给出“table.tsv”中的下表:
ID Value Target Not Used
1 5 9 11
2 4 8 12
3 6 7 10
我可以使用以下方法对“目标”列进行排序:
#!/bin/bash
(IFS=$'\t'; read -r; printf "%s\n" "$REPLY"; i=0; for col in $REPLY; do
((++i))
[ "$col" == "Target" ] && break
done; sort -t$'\t' "-k$i,${i}n") < table.tsv
有没有办法在没有 for 循环的情况下做到这一点(或者至少清理一下)?
给定脚本的预期输出是:
ID Value Target Not Used
3 6 7 10
2 4 8 12
1 5 9 11
然而,我试图举一个例子来说明我正在尝试做的事情。我想通过多个程序传递/过滤我的表,因此应保留标题和所有列:只需在每个步骤中进行处理即可。
在伪代码中,我想做的是:
print headings from stdin
i=$(magic to determine column position given "Target")
sort -t$'\t' "-k$i,${i}n" # or whatever processing is required on that column
另一种有很多管道的替代方案
$ head -1 table | tr -s ' ' '\n' | nl -nln | grep "Target" | cut -f1
提取第一行、转置、数行、查找列名、提取数字
Or, awk
来救援!
$ awk -v RS='\t' '/Target/{print NR; exit}' file.tsv
3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)