我正在嘗試實作 shell 腳本來讀取 csv 檔案并計算 2 列的總和并添加到名為 total 的新列中。但它沒有成功完成。請建議我如何實作這一目標。
我的輸入 csv 檔案
a,b,c
1,2,3
4,5,6
預期產出
a,b,c,total
1,2,3,5
4,5,6,11
這里 a 是主鍵
我嘗試了下面的代碼來實作這一點
echo "First arg: 1"
awk "{print $3 $2 """""" $1}"
echo "First arg: 2
awk -F, "{$(NF 1)=Null;}1" OFS=, file.csv
awk -F "," "{print $1,$2,$3,$2 $3}"
我的輸出是:
C:\Users\inrenan\NIFI\NIFI-1~1.2-B\NIFI-1~1.2>awk -F "," "{print $1,$2,$3,$2 $3}"
a b c 0
1 2 3 5
4 5 6 11
只有我面臨的問題是列名
uj5u.com熱心網友回復:
這是您需要的 awk 腳本:
BEGIN{ FS=OFS="," } { print $0, (NR==1 ? "total" : $2 $3) }
做任何你必須在 Windows 中使用它的魔法咒語。
在 Unix 中,您只需執行以下操作:
awk 'BEGIN{ FS=OFS="," } { print $0, (NR==1 ? "total" : $2 $3) }' input
a,b,c,total
1,2,3,5
4,5,6,11
但我聽說 Windows 有一些最好避免的奇怪參考規則,所以我看到的 Windows 常見建議是將腳本保存在一個名為 script.awk 的檔案中(你也可以在 Unix 中這樣做)并呼叫它作為:
awk -f script.awk input
a,b,c,total
1,2,3,5
4,5,6,11
根據您問題中的最后一個腳本,這可能適用于 Windows,但我真的不知道 Windows 參考規則:
awk "BEGIN{ FS=OFS=\",\" } { print $0, (NR==1 ? \"total\" : $2 $3) }" input
uj5u.com熱心網友回復:
對于非常繁瑣的單行:
awk -F',' '{if (NR==1) {printf "%s,total\n",$0;} else {sum=0; for(i=2; i<=NF; i ) {sum =$i}; {printf "%s,%s\n",$0,sum;}}}' file.csv
uj5u.com熱心網友回復:
使用您顯示的樣本,請嘗試以下awk程式。這里提到一個awk名為的變數fields,它的值為2,3我們可以提到分隔的欄位編號,,它將負責處理所有這些欄位的總和。
awk -v fields="2,3" '
BEGIN{
FS=OFS=","
num=split(fields,arr,",")
for(i=1;i<=num;i ){
field[arr[i]]
}
}
FNR==1 { print $0,"total"; next }
FNR>1{
sum=0
for(i=1;i<=NF;i ){
if(i in field){ sum =$i }
}
$(NF 1)=sum
}
1
' Input_file
uj5u.com熱心網友回復:
這是一個獲得所需輸出的純批處理檔案:
@echo off
setlocal EnableDelayedExpansion
set /P "header=" < input.txt
echo !header!,total
for /f "skip=1 tokens=1-3 delims=," %%a in (input.txt) do (
set /A "total=%%b %%c"
echo %%a,%%b,%%c,!total!
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/352887.html
