Bash拆分并按同一文件中的两列排序

时间:2019-06-17 05:03:44

标签: bash

对于我的文件,如下所示:

AABBCC    10    5    CCAABB    100
BBCCAA    4     2    AABBCC    50
CCAABB    16    8    BBCCAA    20

...我正在尝试通过将第4列与第1列匹配来对第4列和第5列进行排序。

理想情况下,它将返回:

AABBCC    10    5    AABBCC    50
BBCCAA    4     2    BBCCAA    20
CCAABB    16    8    CCAABB    100

我尝试使用排序,但是据我所知,它没有用于在文件中排序的实用程序。

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:3)

awk 解决方案:

awk 'NR==FNR{ a[$4]=$5; next }$1 in a{ print $1,$2,$3,$1,a[$1] }' file1 OFS="\t" file1

输出:

AABBCC  10      5       AABBCC  50
BBCCAA  4       2       BBCCAA  20
CCAABB  16      8       CCAABB  100

您可以在最后通过管道发送到sort... | sort

答案 1 :(得分:2)

join -t $'\t' -o 1.1,1.2,1.3,2.1,2.2 <(cut -f1-3 file.tsv | sort -k 1,1) <(cut -f4- file.tsv | sort -k 1,1) | sort

剪切原始文件,然后在两个文件的第一个字段上合并。我们需要在-o中指定完整连接字段以保留第一列,否则join会吃掉它。

答案 2 :(得分:2)

使用bash和GNU粘贴:

带有用于说明的临时文件:

cut -f 1-3 file | sort > file_1to3
cut -f 4-5 file | sort > file_4to5
paste -d '\t' file_1to3 file_4to5

没有临时文件:

paste -d '\t' <(cut -f 1-3 file | sort) <(cut -f 4-5 file | sort)

输出:

AABBCC  10      5       AABBCC  50
BBCCAA  4       2       BBCCAA  20
CCAABB  16      8       CCAABB  100