Linux

如果 E 或 F 列為空或值為 0,則複製 B 列

  • February 14, 2021

我有一個 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

引用自:https://unix.stackexchange.com/questions/634158