我想將 .csv 中的所有重復名稱更改為唯一名稱,但是在找到重復名稱后我無法到達上一行,因為它已經列印了。我試圖將所有行保存在陣列中并在 End 部分列印,但它不起作用,我不明白如何訪問這個陣列中的特定欄位(awk 不支持二維陣列?) .
樣本輸入
...,9,phone,...
...,43,book,...
...,27,apple,...
...,85,hook,...
...,43,phone,...
期望的輸出
...,9,phone9,...
...,43,book,...
...,27,apple,...
...,85,hook,...
...,43,phone43,...
我的嘗試($2 - id 欄位,$3 - name 欄位)
BEGIN{
FS=","
OFS=","
marker=777
}
{
if (names[$3] == marker) {
$3 = $3 $2
#Attempt to change previous duplicate
results[nameLines[$3]]=$3 id[$3]
}
names[$3] = marker
id[$3] = $2
nameLines[$3] = NR
results[NR] = $0
}
END{
#it prints some numbers, not saved lines
for(result in results)
print result
}
uj5u.com熱心網友回復:
這是awk將所有記錄存盤在緩沖區中的單通道:
awk -F, '
{
rec[NR] = $0
fq[$3]
}
END {
for (i=1; i<=NR; i) {
n = split(rec[i], a, /,/)
if (fq[a[3]] > 1)
a[3] = a[3] a[2]
for (k=1; k<=n; k)
printf "%s", a[k] (k < n ? FS : ORS)
}
}' file
...,9,phone9,...
...,43,book,...
...,27,apple,...
...,85,hook,...
...,43,phone43,...
uj5u.com熱心網友回復:
這可以在 2 遍 Input_file 中輕松完成awk,我們不需要在其中創建二維陣列。使用您展示的用 GNU 撰寫的示例awk。
awk '
BEGIN{FS=OFS=","}
FNR==NR{
arr1[$3]
next
}
{
$3=(arr1[$3]>1?$3 $2:$3)
}
1
' Input_file Input_file
輸出如下:
...,9,phone9,...
...,43,book,...
...,27,apple,...
...,85,hook,...
...,43,phone43,...
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/521560.html
標籤:linuxawk
