这是我的工作文件。(不知道列号和行号)
key_ID col_1 col_2 col_3
AA 1 1 1
BB 56 2 7
CC 89 5 2
DD 7 77 7
我想对底部2个值的每一列进行排序,以便key_ID
从第一列中找到它们的对应值。
所需的输出像
col_1 col_2 col_3
AA AA AA
DD BB CC
使用pure bash
:
#!/bin/bash
DATA=/path/to/input_data
COL_NUMS=$(head -1 $DATA | wc -w)
FILES=''
for i in $(seq 2 $COL_NUMS)
do
FILE=$(mktemp)
echo col_$((i-1)) > $FILE
cut -f1,$i -d' ' <(tail -n +2 $DATA | tr -s ' ') |
sort -k2 -g | head -2 | cut -f1 -d' ' >> $FILE
FILES="$FILES $FILE"
done
paste $FILES
rm $FILES
输出:
col_1 col_2 col_3
AA AA AA
DD BB CC
它所做的就是逐一并分别查看列及其标签,例如labels,col1
,然后labels,col2
依此类推。
for i in $(seq 2 $COL_NUMS)
do
...
cut -f1,$i -d' ' <(tail -n +2 $DATA | tr -s ' ')
然后,它排序并查找每个组中具有最低两个值的标签,并将它们放入临时文件中。
FILE=$(mktemp)
...
sort -k2 -g | head -2 | cut -f1 -d' ' >> $FILE
在执行此操作时,我们将创建所有这些文件的列表。
FILES="$FILES $FILE"
因此,现在我们有一堆包含所需列表的临时文件,我们应该使用paste
命令将它们放在一起并删除这些临时文件:
paste $FILES
rm $FILES
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句