Awk

用其他文件的值替換文件的特定行

  • March 24, 2021

我想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

在讀取file1FNR == 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

引用自:https://unix.stackexchange.com/questions/640752