1.txt

1.txt

これは私の2つのファイルです

1.txt

1
2
3
4
5

2.txt

2       a
5       3

私が受け取ったファイルよりawk -F '\t' 'NR==FNR{F1[$0];next}$1 in F1{print}' 1.txt 2.txt

2       a
5       3

しかし、私はこのようなファイルを取得したい

1
2    a
3
4
5    3

または

1     0
2     a
3     0
4     0
5     3

答え1

スペースを2.txtもう一度タブに変換しますsed -i 's/ */\t/' 2.txt

awk -F '\t' '
  BEGIN{OFS=FS} NR==FNR{F1[$1]=$2; next} {print $1, ($1 in F1)? F1[$1] : 0}
' 2.txt 1.txt
1       0
2       a
3       0
4       0
5       3

答え2

join代わりに使用してくださいawk。両方のファイルが最初のフィールドにソートされているとします(質問にあります)。

$ join -a 1 1.txt 2.txt
1
2 a
3
4
5 3

この-a 1オプションを使用すると、ユーティリティは最初のフィールドにリンクされている行だけでなく、最初のファイルのすべての行も報告します。

欠落値をゼロでさらに置き換えるには、特定のjoinフィールドを出力するように要求し、欠落値も置換する必要があります0-o 1.1,2.2最初のファイルの最初のフィールドと2番目のファイルの2番目のフィールドが必要で、欠落している-e 0データを次に置き換えます0

$ join -a 1 -o 1.1,2.2 -e 0 1.txt 2.txt
1 0
2 a
3 0
4 0
5 3

区切り文字をタブで明示的に設定するには、-t $'\t'withを使用します。joinこれにより、ユーティリティは出力にタブ文字を使用します。

関連情報