[英]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.