Saya memiliki beberapa file (tabel) bernama:institute _
model _
skenario _
sungai .txt
(lembaga , model , skenario , dan sungai adalah variabel.) Saya ingin membuat for
loop yang akan mengidentifikasi setiap file yang memiliki institusi same yang sama nama dan pada saat yang sama skenario nama, untuk menambahkan hasil dari setiap model yang berbeda dalam file output yang sama, menggunakan perintah berikut:
paste filename1.txt filename2.txt > output_file.txt
Saya tahu cara membuat for
loop di atas folder yang berbeda tetapi tidak di atas nama file. Ada yang punya ide?
Sebagai contoh minimal, nama file bisa sebagai berikut:
wbm_gfdl_rcp8p5_mississippi.txt
wbm_hadgem_rcp8p5_mississippi.txt
matsiro_gfdl_rcp8p5_mississippi.txt
matsiro_ipsl_rcp4p5_mississippi.txt
matsiro_hadgem_rcp4p5_mississippi.txt
matsiro_miroc_rcp8p5_mississippi.txt
Kemudian, saya ingin menambahkan file-file berikut bersama-sama:
wbm_gfdl_rcp8p5_mississippi.txt with
wbm_hadgem_rcp8p5_mississippi.txt
matsiro_ipsl_rcp4p5_mississippi.txt with
matsiro_hadgem_rcp4p5_mississippi.txt
matsiro_gfdl_rcp8p5_mississippi.txt with
matsiro_miroc_rcp8p5_mississippi.txt
Jawaban yang Diterima:
Jika semua file berada dalam direktori yang sama, Anda dapat:
ls |
awk -F_ '{ i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] " " $0 }
END{ for(insc in f)
printf "paste%s >out_%s.txt\n",f[insc],insc
}'
yang membagi nama file pada “_” (-F_
), menetapkan variabel i,m,s
ke 3 bagian pertama dari nama file (institute,model,scenario),
dan terakumulasi dalam array f nama file. Array diindeks
hanya oleh lembaga dan skenario, jadi semua model digabungkan
(m tidak digunakan). END terakhir mencetak larik f, dan menggunakan indeks (institute_scenario) sebagai nama
untuk file output. Dengan contoh Anda, ini menghasilkan
paste wbm_gfdl_rcp8p5_mississippi.txt wbm_hadgem_rcp8p5_mississippi.txt >out_wbm_rcp8p5.txt
paste matsiro_hadgem_rcp4p5_mississippi.txt matsiro_ipsl_rcp4p5_mississippi.txt >out_matsiro_rcp4p5.txt
paste matsiro_gfdl_rcp8p5_mississippi.txt matsiro_miroc_rcp8p5_mississippi.txt >out_matsiro_rcp8p5.txt
Anda kemudian perlu menyalurkan ini ke dalam Shell untuk menjalankannya. Tambahkan | sh
ke baris terakhir di atas untuk melakukan ini.
Untuk menghapus beberapa kolom dari file input, Anda perlu mengubah baris awk
yang mengumpulkan semua nama file input. Di baris pertama awk:
{ i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] " " $0 }
nama filenya adalah "$0". Misalnya, jika Anda mengubah baris ini menjadi:
{ i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] sprintf(" <(cut -f4 %s)",$0) }
maka Anda akan mendapatkan contoh output:
paste <(cut -f4 wbm_gfdl_rcp8p5_mississippi.txt) <(cut -f4 wbm_hadgem_rcp8p5_mississippi.txt) >out_wbm_rcp8p5.txt
tetapi jika Anda hanya ingin memotong nama file ke-2, ini sedikit lebih rumit dan
Anda memerlukan ini sebagai gantinya:
{ i=$1; m=$2; s=$3;
if(f[i"_"s]=="")add = $0; else add = sprintf("<(cut -f4 %s)",$0);
f[i"_"s] = f[i"_"s] " " add }
jadi Anda akan mendapatkan
paste wbm_gfdl_rcp8p5_mississippi.txt <(cut -f4 wbm_hadgem_rcp8p5_mississippi.txt) >out_wbm_rcp8p5.txt
Jika sh
tidak mengerti sintaks <(cut ...)
lalu ganti dengan bash
.