Bash join command

后端 未结 3 1422
长发绾君心
长发绾君心 2020-12-16 19:13

Infile1:

1 a
3 c
4 d
6 f

Infile2:

1 a 
2 b
5 e
6 f
7 g
8 h

How do I join these files with the unix join c

相关标签:
3条回答
  • 2020-12-16 19:32

    First sort both files. Then use join to join on the first field of both files. You also need to pipe the output through sed if you want to remove the space and thus convert a a into aa. This is shown below:

    $ join -t " " -1 1 -2 1 -a 1 -a 2  <(sort file1) <(sort file2) | sed 's/ \([a-z]\) / \1/g'
    1 aa
    2 b
    3 c
    4 d
    5 e
    6 ff
    7 g
    8 h
    
    0 讨论(0)
  • 2020-12-16 19:32

    this should work for your both cases:

    awk 'NR==FNR{a[$1]=$2;next;} {a[$1]=($1 in a)?a[$1]$2:$2}END{for(x in a)print x,a[x]}' f1 f2|sort
    

    output for case one:

    1 aa
    2 b
    3 c
    4 d
    5 e
    6 ff
    7 g
    8 h
    

    output for case two:

    27 277
    28 2213
    29 376
    30 1512
    31 2130
    32 135
    33 1810
    34 2428
    
    0 讨论(0)
  • 2020-12-16 19:52

    Works for me (almost). You should specify -t $'\t' for the tab character, not just -t \t. Bash does not interpret \t unless in $'' quotes.

    join -t $'\t' -o 1.2,2.2 <(echo  $'27\t27
    28\t22
    29\t37
    30\t15
    31\t21
    32\t13
    33\t18
    34\t24' | sort) <(echo $'27\t7
    28\t13
    29\t6
    30\t12
    31\t30
    32\t5
    33\t10
    34\t28' | sort)
    27      7
    22      13
    37      6
    15      12
    21      30
    13      5
    18      10
    24      28
    
    0 讨论(0)
提交回复
热议问题