Text-Processing

修復 phylip 生物資訊學文件的標題以準確反映文件中更新的樣本數量

  • May 16, 2019

我有一個我正在使用的數據集,它由我一直在編輯的 phylip 文件組成。Phylip 格式是一種生物資訊學格式,其中包含作為標題的樣本數量和序列長度,然後是每個樣本及其序列。例如:

5 10
sample_1 gaatatccga
sample_2 gaatatccga
sample_3 gaatatcgca
sample_4 caatatccga
sample_5 gaataagcga

我的問題是,在修剪這些數據集時,標題中的樣本數不再準確(例如,在上面的範例中可能會說五個,但我已經修剪為只有三個樣本)。我需要做的是用新的、準確的樣本計數替換該樣本計數,但我無法弄清楚如何在不失去序列長度編號(例如 10)的情況下這樣做。

我有 550 個文件,因此不能簡單地手動執行此操作。我可以對 wc 進行循環,但我需要再次保留該序列長度資訊,並以某種方式將其與新的、準確的 wc 結合起來。

如果我正確理解您的要求,您可以使用以下awk命令:

awk -v samples="$(($(grep -c . input)-1))" 'NR == 1 { $1=samples }1' input

samples將設置為input文件中的行數減一(因為您不計算標題行)。

awk然後將第一行的第一列更改為新的樣本編號並列印所有內容。


$ cat input
5 10
sample_1 gaatatccga
sample_2 gaatatccga
sample_3 gaatatccga
$ awk -v samples="$(($(grep -c . input)-1))" 'NR == 1 { $1=samples }1' input
3 10
sample_1 gaatatccga
sample_2 gaatatccga
sample_3 gaatatccga

使用 GNU awk,您可以使用該-i標誌來修改文件,但我更願意製作第二組修改後的文件,以確保進行了正確的更改。

就像是:

for file in *.phy; do
   awk -v samples="$(($(grep -c . "$file")-1))" 'NR == 1 { $1=samples }1' "$file" > "${file}.new"
done

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