我有一個大的 tsv.gz 檔案(40GB),我想從現有變數中提取一個字串col3,將其存盤在一個新變數中New_var(放在開頭)并將所有內容保存在新檔案中。資料“old_file.tsv.gz”的示例
col1 col2 col3 col4
1 positive 12:1234A 100
2 negative 10:9638B 110
3 positive 5:0987A 100
4 positive 8:5678A 170
所需資料“new_file.tsv.gz”
New_var col1 col2 col3 col4
12 1 positive 12:1234A 100
10 2 negative 10:9638B 110
5 3 positive 5:0987A 100
8 4 positive 8:5678A 170
我是 bash 的新手,所以我嘗試了多種方法,但我被卡住了,我試過了
zcat old_file.tsv.gz | awk '{print New_var=$3,$0 }' | awk '$1 ~ /^[0-9]:/{print $0 | (gzip -c > new_file.tsv.gz) }'
我認為我有多個問題。{print New_var=$3,$0 }確實創建一個副本col3但不重命名它。然后當我添加代碼的最后一部分時awk '$1 ~ /^[0-9]:/{print $0 | (gzip -c > new_file.tsv.gz) }'......好吧,什么都沒有出現(我試圖看看我是否忘記了括號但找不到問題)。我也不確定這種方式是否是最好的方式。知道如何使它作業嗎?
uj5u.com熱心網友回復:
在單獨的檔案中創建一個 AWK 腳本(為了便于閱讀),例如1.awk:
{ if (NR > 1) {
# all data lines
split($3, a, ":");
print a[1], $1, $3, $3, $4;
} else {
# header line
print "new_var", $1, $2, $3, $4;
}
}
1.csv.gz現在使用 AWK 檔案處理輸入(比如):
zcat 1.csv.gz | awk -f 1.awk | gzip -c > 1_new.csv.gz
uj5u.com熱心網友回復:
我建議使用一個制表符 ( \t) 并:作為輸入欄位分隔符:
awk 'BEGIN { FS="[\t:]"; OFS="\t" }
NR==1 { $1="New_var" OFS $1 }
NR>1 { $0=$3 OFS $0 }
{ print }'
一行:
awk 'BEGIN{ FS="[\t:]"; OFS="\t" } NR==1{ $1="New_var" OFS $1 } NR>1{ $0=$3 OFS $0 } { print }'
請參閱:8 個強大的 Awk 內置變數——FS、OFS、RS、ORS、NR、NF、FILENAME、FNR
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/476681.html
上一篇:回圈從bash中的值創建aaDF
下一篇:jq不顯示空輸出
