2つのファイルがあります。まず、
a 0.1 c t 0.4
c 0.25 g a 0.1
d 0.567 c c 0.00004
q 0.76 f c 0.05
二つ目は、
a hello
c goodbye
d morning
q hungry
次のようにファイルを作成したいと思います。
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05
どうすればいいですか?
答え1
この試み、
ファイルがソートされているので、join
次のコマンドを直接使用できます。
join Second First | cut -f2- -d' '
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05
ソートされていない場合は、次のコードを使用してください。
join <(sort second) <(sort first) | cut -f2- -d' '
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05
答え2
awk
最初の列のみを使用するように2番目のファイルを処理し、最初のファイルを使用して埋める方法は非常に簡単です。
awk 'FNR == NR { map[$1] = $2; next } ($1 in map) { $1 = map[$1] }1 ' second first
答え3
別のjoin
方法は、結合の組み込み機能を使用することです。
$ join -o 2.2,1.2,1.3,1.4,1.5 <(sort file1) <(sort file2)
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05
-o
出力形式を指定できます。ここではjoin
、ファイル2()の2番目のフィールドを使用してから、ファイル1(2.2
)の最初、2番目、3番目、4番目、および5番目のフィールドを使用するように指示します1.2,1.3,1.4,1.5
。
答え4
ペーストを使用してください。
paste <(cut -d ' ' -f2- file2) <(cut -d ' ' -f2- file1)
シェルを使用してください。
while IFS= read -r file2 <&3; do
IFS= read -r file1
printf '%s %s\n' "${file2##* }" "${file1#* }"
done 3<file2 <file1
ガイドライン
どちらもソートされておらず、大容量ファイル/データが関連しているとシェルが遅くなります。
インデントなしで書式を直接貼り付けます。