我需要編輯一個對 .vcf 檔案進行排序的 bash 腳本。vcf 檔案的結構大致如下圖所示:
## header line
## header line
…
Data line
Data line
…
該腳本稱為vcfsort,是用于操作 vcf 檔案的庫的一部分。它看起來像這樣:
head -1000 $1 | grep "^#"; cat $@ | grep -v "^#" | sort -k1,1d -k2,2n
它是通過寫作來運行的vcfsort input.vcf > output.vcf。我大致了解它的作用:由于只能在資料行上進行排序,因此它會獲取標題行:
head -1000 $1 | grep "^#";
并將其與排序的資料線結合起來:
cat $@ | grep -v "^#" | sort -k1,1d -k2,2n
我需要 head 命令來閱讀更多行。而不是像上面那樣呼叫 vcfsort ,我想我可以自己編輯腳本并將其直接寫成這樣的命令:
head -10000 input.vcf | grep "^#"; cat input.vcf | grep -v "^#" | sort -k1,1d -k2,2n > output.vcf
這不能按預期作業。如果我遺漏了,我上面的嘗試會將正確的輸出寫入標準輸出> output.vcf。但是,如果我包含它,則只有資料行寫入檔案,標題行寫入標準輸出。所以,我有幾個問題:
- 在此堆疊溢位答案中,據說要組合以分號分隔的命令,應將它們括在括號中。為什么在 vcfsort 腳本中不是這種情況?
- 為什么
$@在 cat 命令中使用而不是$1?$@應該參考所有的 shell 腳本引數,但由于只給出了一個(輸入檔案),為什么不直接使用 $1?如果有這個原因,我怎樣才能將它轉移到我的命令列運算式? - 為什么當我將它發送到檔案時,我只得到部分標準輸出?
- 你能告訴我我需要做哪些編輯才能讓我的命令按預期作業嗎?
uj5u.com熱心網友回復:
所以腳本獲得了第一個檔案的前 1000 行!分隔標題,基本上只是將前 1000 行中的所有注釋復制到輸出。
接下來,它過濾所有檔案的所有注釋行(只留下資料行),并進行排序。
所以如果你使用
vcfsort file1 file2 file3
$1 = "file1" 并且僅來自 file1 的標頭將顯示在輸出中。
而 $@ 指的是所有檔案:“file1 file2 file3”
如果您需要從所有檔案中獲取標題并將其合并 - 我建議使用回圈。
for file in $@; do
head -1000 $file | grep "^#";
done
cat $@ | grep -v "^#" | sort -k1,1d -k2,2n
為什么當我將它發送到檔案時,我只得到部分標準輸出?
頭 -10000 輸入.vcf | grep "^#"; 貓輸入.vcf | grep -v "^#" | 排序 -k1,1d -k2,2n > output.vcf
每個命令單獨執行(用分號“;”分隔)。因此,在上面的示例中,您只需在排序后重定向資料行輸出。它不會重定向到檔案頭部分。我建議洗掉重定向到檔案并使用:
vcfsort input.vcf > output.vcf
這不能按預期作業
我可以知道預期的結果嗎?
uj5u.com熱心網友回復:
有兩個命令串列,由 a 分隔;,內部vcfsort:
head -1000 $1 | grep "^#"cat $@ | grep -v "^#" | sort -k1,1d -k2,2n
每個串列都是一個管道。每個管道中的最后兩個命令從 繼承其標準輸出vcfsort,因此當您運行
vcfsort input.vcf > output.vcf
grep和sort寫給output.vcf. _
使用大括號的等效項是(;為了便于閱讀,用換行符替換)
# Quoting the parameter expansions is important, to protect
# against word-splitting and pathname expansion of the original arguments.
{ head -1000 "$1" | grep "^#"
cat "$@" | grep -v "^#" | sort -k1,1d -k2,2n
} > output.vcf
輸出重定向僅適用于單個命令,而不適用于命令串列。在這里,一個命令組用作該單個命令:命令組的標準輸出是output.vcf,并且組中的兩個串列像以前一樣繼承它。
你的嘗試
head -10000 input.vcf | grep "^#"; cat input.vcf | grep -v "^#" | sort -k1,1d -k2,2n > output.vcf
僅打開output.vcf用作sort;的標準輸出 的標準輸出grep仍然是它從其父級(即您的終端)繼承的任何標準輸出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/422206.html
標籤:
