增加(複製)n筆記錄的字段

增加(複製)n筆記錄的字段

我有一個如下所示的文件:

A a
2 b
3 c
4 d
5 e
B a
2 b
3 c
4 d
5 e

輸出應該是這樣的

A a
A b
A c
A d
A e
B a
B b
B c
B d
B e

這個腳本:

awk {if ( NR%5 != 1 ) {print VAR, $2} else {print $1, $2} VAR=$1}

不起作用(結果如下):

A a
A b
2 c
3 d
4 e
B a
B b
2 c
3 d
4 e

看來我遺漏了一些關於文法或變數工作方式的內容。 awk 腳本有解決方案嗎?

謝謝

答案1

$ awk '$1 ~ /^[[:upper:]]/ { letter = $1 } { $1 = letter; print }' file
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e

letter如果在字段開頭偵測到大寫字符,則只需將變數設為第一個字段的值。然後,它無條件地將第一個欄位設定為已儲存的資料並列印該行。

使用每五行選取第一個欄位的方法,並進行簡化:

$ awk 'FNR % 5 == 1 { letter = $1 } { $1 = letter; print }' file
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e

在這兩種變體中,我無條件地將第一個欄位設為 的值letter並列印當前記錄。這簡化了程式碼。

程式碼中的主要錯誤是它設定VAR$1for每一個輸入線:

{
    if ( NR%5 != 1 ) {
        print VAR, $2
    } else {
        print $1, $2
    }
    VAR = $1  # <-- problem: is triggered on every line
}

答案2

透過下面的腳本完成

step1: z=`awk 'END{print NR}' filename`
 step2: for ((i=1;i<=$z;i++)); do j=$(($i+4)); u=`awk -v i="$i" 'NR==i{print $1}' o.txt`;sed -n ''$i','$j'p' filename| awk -v u="$u" '{$1=u;print $0}'; i=$j; done

輸出

A a
A b
A c
A d
A e
B a
B b
B c
B d
B e

相關內容