Saya memiliki dua file tab-terpisah yang terlihat sebagai berikut:
file1:
NC_008146.1 WP_011558474.1 1155234 1156286 44173
NC_008146.1 WP_011558475.1 1156298 1156807 12
NC_008146.1 WP_011558476.1 1156804 1157820 -3
NC_008705.1 WP_011558474.1 1159543 1160595 42748
NC_008705.1 WP_011558475.1 1160607 1161116 12
NC_008705.1 WP_011558476.1 1161113 1162129 -3
NC_009077.1 WP_011559727.1 2481079 2481633 8
NC_009077.1 WP_011854835.1 1163068 1164120 42559
NC_009077.1 WP_011854836.1 1164127 1164636 7
file2:
NC_008146.1 GCF_000014165.1_ASM1416v1_protein.faa
NC_008705.1 GCF_000015405.1_ASM1540v1_protein.faa
NC_009077.1 GCF_000016005.1_ASM1600v1_protein.faa
Saya ingin mencocokkan kolom 1 dari file1 ke file2 dan menggantikannya dengan entri kolom 2 masing-masing dari file 2. Outputnya akan terlihat seperti ini:
GCF_000014165.1_ASM1416v1_protein.faa WP_011558474.1 1155234 1156286 44173
GCF_000014165.1_ASM1416v1_protein.faa WP_011558475.1 1156298 1156807 12
GCF_000014165.1_ASM1416v1_protein.faa WP_011558476.1 1156804 1157820 -3
GCF_000015405.1_ASM1540v1_protein.faa WP_011558474.1 1159543 1160595 42748
GCF_000015405.1_ASM1540v1_protein.faa WP_011558475.1 1160607 1161116 12
GCF_000015405.1_ASM1540v1_protein.faa WP_011558476.1 1161113 1162129 -3
GCF_000016005.1_ASM1600v1_protein.faa WP_011559727.1 2481079 2481633 8
GCF_000016005.1_ASM1600v1_protein.faa WP_011854835.1 1163068 1164120 42559
GCF_000016005.1_ASM1600v1_protein.faa WP_011854836.1 1164127 1164636 7
Jawaban:
Anda dapat melakukannya dengan sangat mudah dengan
awk
:Atau, karena itu terlihat seperti file yang dipisahkan-tab:
Ini mengasumsikan bahwa setiap
NC_*
id RefSeq ( ) difile1
memiliki entri yang sesuai difile2
.Penjelasan
NR==FNR
: NR adalah nomor baris saat ini, FNR adalah nomor baris file saat ini. Keduanya akan identik hanya saat file 1 (di sini,file2
) sedang dibaca.a[$1]=$2; next
: jika ini adalah file pertama (lihat di atas), simpan bidang ke-2 dalam array yang kuncinya adalah bidang ke-1. Kemudian, lanjutkan kenext
garis. Ini memastikan blok berikutnya tidak dijalankan untuk file ke-1.{$1=a[$1]; print}
: sekarang, di file kedua, setel bidang 1 ke nilai apa pun yang disimpan dalam arraya
untuk bidang 1 (jadi, nilai terkait darifile2
) dan cetak baris yang dihasilkan.sumber
NR == FNR
tidak berfungsi dengan benar saat file pertama kosong. Lihat ini dan jawaban yang terkait untuk solusifile2
dan tidakfile1
kosong. Perilaku waras saatfile2
kosong adalah melaporkan isifile1
. MasalahnyaNR == FNR
adalah kode yang terkait dengannya dieksekusi pada isifile1
saatfile2
kosongTidak perlu awk, dengan asumsi file diurutkan, Anda dapat menggunakan coreutils bergabung:
Keluaran:
Jika file Anda tidak diurutkan, Anda dapat mengurutkannya terlebih dahulu (
sort file1 > file1.sorted; sort file2 > file2.sorted
) dan kemudian menggunakan perintah di atas, atau, jika shell Anda mendukung<()
konstruk (bash tidak), Anda dapat melakukan:sumber
Diuji dengan perintah di bawah dan bekerja dengan baik
keluaran
sumber