Pertimbangkan file-file berikut:
file1
:
boo,8,1024
foo,7,2048
file2
:
foo,0,24,154
noo,0,10,561
file3
:
24,154,7,1024,0
Yang saya butuhkan adalah pergi ke File1 dan periksa apakah $2==7
; jika benar, ambil $1
, $2
dan $3
dari File1 ; sekarang saya harus membandingkan jika $1
dari File1 sama dengan $1
dari File2 ; jika benar, saya harus mengambil $3
dan $4
dari File2 yang tidak ada di File1 , maka saya harus pergi ke File3 dan memeriksa apakah $1
dari File3 sama dengan $3
dari File2 , dan $2
dari File3 sama dengan $4
dari File2 ; jika ya, maka saya harus memeriksa jika $2
dari File1adalah sama dengan $3
dari file3 , maka jika kondisi ini benar, saya harus membandingkan $3
dari File1 dengan $4
dari file3 , jika $3
dari File1 lebih dari $4
dari file3 .
Saya mencoba skrip berikut:
cat [file1] [file2] [file3] |
awk -F,
'{if(NF==3)
{if($2==7){a[$1]=$1; b[$1]=$2; c[$1]=$3}
}else
{if(NF==4){if(a[$1]==$1){d[$3]=$3; e[$4]=$4}
}else
{if(NF==5){if(d[$1]==$1 && e[$2]==$2){print a[$1], b[$1], c[$1], d[$1]}}
}
}
}'
Output yang diinginkan adalah:
foo,7,2048,24,154,1024
sumber
Solusi TXR:
Lari:
Tetapi pengamat yang cerdik akan mencatat bahwa 7 belum ditentukan di mana pun dalam kode, hanya muncul di output! Itu karena kode sebenarnya berbaris melalui semua catatan
file1
dan mencetak semua kombinasi yang memenuhi kecocokan dan kendala . Satu-satunya di data sampel adalah satu denganval0
yang7
.Jika ada lebih banyak kombinasi yang ditemukan, itu bisa dibatasi hanya yang
7
seperti ini:Bahasa ekstraksi pola TXR menyediakan di sini satu kecocokan pola besar dengan referensi balik implisit melalui pengulangan nama-nama variabel, mencakup beberapa file, dengan pola ekstraksi multi-garis, dan kendala non-tekstual, ditambah efek samping tertanam seperti output, dan sebagainya .
Solusi awk yang diterima dengan cermat menerjemahkan
awk
makro TXR Lisp :Lari:
Bagian yang
,1024
diperlukan dalam output tidak ada; "Awk Classic" asli memiliki perilaku ini.sumber