簡體   English   中英

如何使用 AWK 或 SED 替換 CSV 文件中的多個列?

[英]How to replace multiple columns in CSV file using AWK or SED?

我想用文件中的一些鍵替換一行中的列

for val in "${keyarr[@]}";
do
    while read dataline <&3 && read keyline <&4; do
        echo $dataline |
        awk -F $ifs -v col=$val -v line=$keyline '{
            $col=line; print $0 ;} ' OFS=$ifs > sourcedata1
    done 3<sourcedata1 4<keysnotfound
done

val是我想用一個鍵替換的列號。

所以我可能有多個列要替換。

此解決方案不起作用。 如何一次用鍵替換多個列。

例如,我從sourcedata1獲取一行

101, 102, 103 , 104

並來自 while 循環中的keynotfound

105

在 for 循環的第一次迭代中val = 1

然后我想用鍵替換數據線的第一列

105, 102, 103, 104

如果val = 3 ,則第二次迭代相同。

105, 102, 105, 104

我不想使用 for 循環,而是想要 AWK 或 SED 本身的解決方案,它應該使用多列中的鍵更新源文件。

您的問題陳述相當晦澀,但我猜像這樣的重構應該可以滿足您的要求。

無需循環遍歷相同的文件並重寫其中一個,只需傳入列索引數組,然后只讀取一次文件。

cols=$(printf '%s;' "${keyarr[@]}")
awk -F "$ifs" -v c="${cols%;}" 'BEGIN { split(c, cols, ";"); OFS=IFS }
    NR==FNR { repl[FNR] = $0; next }
    { for(col in cols) $col = repl[FNR] }' keysnotfound sourcedata1

Awk 成語NR==FNR {...; next } NR==FNR {...; next }是將第一個輸入文件讀入 memory 的常用方法(因為整體輸入行號NR等於當前文件FNR中的行號)。 我們將keysnotfound中的條目讀入repl ,repl 由行號索引。 有了這個,我們可以遍歷並處理第二個文件,我們在其中循環列索引,並將每個索引替換為我們從第一個文件中為該行號收集的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM