Linux
如果 E 或 F 列為空或值為 0,則複製 B 列
我有一個 CSV 文件,我想使用 bash 和命令 awk 或其他任何東西來修改這個文件。
例如,如果列 E 或 F 為空或值為 0,我想複製列 B
AAAA, BBBB, CCCC, DDDD, EEEE, FFFF 11 12 13 14 15 0
輸出:
AAAA, BBBB, CCCC, DDDD, EEEE, FFFF 11 12 13 14 15 12
我怎樣才能做到這一點?
更新:我執行 cat user.csv 並顯示這個
740.58,0,740.58,0,740.58 2452.84,0,2452.84,0,2452.84 898.23,0,898.23,0,898.23 227.57,0,227.57,0,227.57 735.02,0,735.02,0,735.02 640.5,0,640.5,0,640.5 469.31,0,469.31,0,469.31 3744.25,0,3744.25,0,3744.25 462.15,0,462.15,0,462.15 198.79,0,198.79,0,198.79 437.58,0,437.58,0,437.58 515.44,0,515.44,0,515.44
這就是它在 LibreOffice 上的樣子
所以我想要做的是將C列的資訊替換為B列,如果B列的所有資訊都有0如果不是0不改變任何東西,我解釋自己?
對不起我的英語不是那麼好:c
更新:如果語句是這樣的:
如果
$$ [ $2 == 0 $$]; 然後 echo “copy column 3 to 2” awk -F , ‘BEGIN { OFS = FS } $ 2 == 0 { $2 = $3 }; 1’ user.csv > user1.csv else if [[ $ 4 == 0]]; 然後回顯“將第 5 列複製到 4” awk -F , ‘BEGIN { OFS = FS } $4 == 0 { $ 4 = $ 5}; 1’ user.csv > user1.csv fi fi
$ awk -F , 'BEGIN { OFS = FS } $2 == 0 { $2 = $3 }; 1' user.csv 740.58,740.58,740.58,0,740.58 2452.84,2452.84,2452.84,0,2452.84 898.23,898.23,898.23,0,898.23 227.57,227.57,227.57,0,227.57 735.02,735.02,735.02,0,735.02 640.5,640.5,640.5,0,640.5 469.31,469.31,469.31,0,469.31 3744.25,3744.25,3744.25,0,3744.25 462.15,462.15,462.15,0,462.15 198.79,198.79,198.79,0,198.79 437.58,437.58,437.58,0,437.58 515.44,515.44,515.44,0,515.44
awk
如果第二個欄位的數值為零,這用於將每個記錄(行)的第二個欄位(列)設置為第三個欄位的值。該
BEGIN
塊只是將輸出欄位定界符設置為輸入欄位定界符(它是一個逗號,在命令行上用 設置-F
)。尾隨
1
與 相同{ print }
,這會導致無條件列印每條記錄。關於您對問題的更新:如果您想在第 2 列為零(如上)的情況下將第 3 列複製到第 2 列,同時在第 4 列為零的情況下將第 5 列複製到第 4 列,則上述程式碼很容易像這樣擴展:
awk -F , 'BEGIN { OFS = FS } $2 == 0 { $2 = $3 } $4 == 0 { $4 = $5 }; 1' user.csv
gawk ' BEGIN {FS = OFS = "\t"} !$5 {$5 = $2} !$6 {$6 = $2} 1 ' input.tsv
如果輸出看起來正確,請重新執行
gawk -i inplace '...' input.tsv