Awk
超大文本文件操作(添加列;更改列內容)
我有一組非常大(80GB)的文件(基因組變體劑量),目前是“.txt.gz”,並具有以下佈局(列/變數):
> > Chr RSID POS REF ALT Ind1 Ind2…Ind(n) 其中 1:n 是個體 > > >
我想編輯這個文件,這樣:
- Chr 列/變數設置為所有行的特定染色體編號(例如,3)
- 在文件的特定位置插入了一個新列(我希望在 ALT 和 Ind1 之間插入新列/變數……這樣新列將成為編輯文件中的第 6 列)。我還希望將此列的值設置為常數(例如,0)。
最後,我想以與讀入相同的格式輸出編輯後的文件(因此,輸出應為“.txt.gz”
感謝您的幫助,並很樂意提供更多詳細資訊。
解壓縮文件,將未壓縮的數據流傳遞給
awk
,讓我們awk
進行修改,然後將流傳遞給 以gzip
進行壓縮。gzip -c -d <file.txt.gz | awk -F '\t' 'BEGIN { OFS = FS } { $1 = 3; $6 = 0 OFS $6 }; 1' | gzip -c >newfile.txt.gz
該
awk
命令將其輸入欄位分隔符 (FS
) 和輸出欄位分隔符 (OFS
) 設置為製表符。然後它將第一個欄位設置為3
,將第 6 個欄位設置為0
,然後是一個製表符和舊的第 6 個欄位。
1
腳本末尾的唯一awk
字元會導致輸出修改後的數據。的輸入
awk
是來自 的解壓縮數據流,來自gzip -d
的輸出awk
經過gzip
壓縮。如果數據有我們需要單獨修改的標題行:
gzip -c -d <file.txt.gz | awk -F '\t' 'BEGIN { OFS = FS } NR == 1 { $6 = "NEW" OFS $6 } NR != 1 { $1 = 3; $6 = 0 OFS $6 }; 1' | gzip -c >newfile.txt.gz
在這裡,我們根據輸入的行號做不同的事情。如果我們在第 1 行,我們插入標題
NEW
作為新的第 6 個欄位的標題。如果我們不在第 1 行,我們像以前一樣修改數據。您也可以使用 來執行此操作
sed
,但是當您使用 標記問題時,awk
我假設這是您更喜歡使用的工具。