GNU/Linux >> Belajar Linux >  >> Ubuntu

Untuk Loop Dengan Nama File?

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 .


Ubuntu
  1. Tutorial Perintah Shuf Dengan Contoh Untuk Pemula

  2. Enkripsi dan dekripsi file dengan ccrypt

  3. Ganti Nama Mass File Bash Dengan Penghitung?

  1. Bagaimana Cara Membuka File .8 Dengan Man?

  2. Bagaimana cara memahami konten setelah pola?

  3. AWK dan nama file dengan spasi di dalamnya.

  1. Tulis ke file .txt?

  2. Bersarang untuk loop

  3. File mv Linux dengan nama panjang