Awk

超大文本文件操作(添加列;更改列內容)

  • March 17, 2022

我有一組非常大(80GB)的文件(基因組變體劑量),目前是“.txt.gz”,並具有以下佈局(列/變數):

> > Chr RSID POS REF ALT Ind1 Ind2…Ind(n) 其中 1:n 是個體 > > >

我想編輯這個文件,這樣:

  1. Chr 列/變數設置為所有行的特定染色體編號(例如,3)
  2. 在文件的特定位置插入了一個新列(我希望在 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我假設這是您更喜歡使用的工具。

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