Awk
用其他文件的值替換文件的特定行
我想
file1
用每行中的值替換第 2、第 6 和第 7 行,file2
並生成一系列文件等於wc -l file2
cat file1
w 3 y G 7 1.2 Q
cat file2
1 1 1 6 6 7 5 6 5
預期的結果:
cat out1
w 1 y G 7 1 1
cat out2
w 6 y G 7 6 7
cat out3
w 5 y G 7 6 5
awk ' FNR == NR { data[++n] = $0; next } { data[2] = $1; data[6] = $2; data[7] = $3; outname = sprintf("out%d", FNR) # or: outname = "out" FNR for (i = 1; i <= n; ++i) print data[i] >outname close(outname) }' file1 file2
這首先讀取
file1
,然後file2
。在讀取
file1
(FNR == NR
塊)時,程式碼唯一要做的awk
就是將每一行儲存在數組中data
。在閱讀
file2
時,程式碼獲取該文件的一行中的三個欄位中的每一個,並將它們分配給與data
您要更改的行相對應的索引file1
。然後將儲存在其中的行
data
列印到一個文件名,該文件名通過獲取目前行號file2
並將字元串添加out
到它來建構。
close(outname)
僅當您使用的不是 GNU 時才真正需要,awk
並且awk
您寫入的文件超過了打開文件描述符的限制(超過ulimit -n
返回的內容,標準流減去三個)。測試:
$ tree . |-- file1 `-- file2 0 directory, 2 files
$ awk ' FNR == NR { data[++n] = $0; next } { data[2] = $1; data[6] = $2; data[7] = $3; outname = sprintf("out%d", FNR) for (i = 1; i <= n; ++i) print data[i] >outname close(outname) }' file1 file2
$ tree . |-- file1 |-- file2 |-- out1 |-- out2 `-- out3 0 directory, 5 files
$ paste out[123] w w w 1 6 5 y y y G G G 7 7 7 1 6 6 1 7 5