Bash
sed:僅使用變數列表替換模式一次
我是 sed 的新手,想知道如何每次都用不同的變數替換模式
我有一個看起來像這樣的 txt 文件:
@K3KFV:1:1109:11598:25872 @K3KFV:1:2101:22577:15247 @K3KFV:1:1110:13477:13178 @K3KFV:1:2113:23585:6859... (etc)
總共有 200 條不同的線路。另外我還有另一個文件:
ASF356_KB822565.1:1065516-1065795 TAGGTCAAGCCCTCGGTCTATTAGTATTGGTCAGCTTAATACATTGCTGCACTTACACCT CCAACCTATCTACCTTGTTGTCTTCAAGGGACCTTACTCACTTGCGTTTTGGGATATCTT ASF356_KB822565.1:1065796-1066075 CGGATAGGGACCGAACTGTCTCACGACGTTCTGAACCCAGCTCGCGTACCGCTTTAATGG GCGAACAGCCCAACCCTTGGGACCTACTTCAGCCCCAGGATGCGATGAGCCGACATCGAG ASF356_KB822565.1:1066076-1066355 CCTTTTGCCTTTACACTCTTTGAATGGTTTCCAATCATTCTGAGGTGACCTTCGAGCGCC TCCGTTACTCTTTTGGAGGCGACCGCCCCAGTCAAACTGCCCGCCTGACATTGTCCTTCA
其中還包含 200 個“ASF …..”實例
我想要的是用“@K3KFV:…..”中的一行替換包含“ASF …”的行,所以最後它看起來像:
@K3KFV:1:1109:11598:25872 TAGGTCAAGCCCTCGGTCTATTAGTATTGGTCAGCTTAATACATTGCTGCACTTACACCT CCAACCTATCTACCTTGTTGTCTTCAAGGGACCTTACTCACTTGCGTTTTGGGATATCTT @K3KFV:1:2101:22577:15247 CGGATAGGGACCGAACTGTCTCACGACGTTCTGAACCCAGCTCGCGTACCGCTTTAATGG GCGAACAGCCCAACCCTTGGGACCTACTTCAGCCCCAGGATGCGATGAGCCGACATCGAG @K3KFV:1:1110:13477:13178 CCTTTTGCCTTTACACTCTTTGAATGGTTTCCAATCATTCTGAGGTGACCTTCGAGCGCC TCCGTTACTCTTTTGGAGGCGACCGCCCCAGTCAAACTGCCCGCCTGACATTGTCCTTCA
這是我到目前為止的shell腳本:
input="K3KFVfile.txt" while IFS= read -r title do sed '/ASF/c'$title'' ASF_file done < "$input"
但是,我沒有給我 200 行 @K3KFV … 我得到 40000,因為每條 ASF 行都被 @K3KFV 中的每一行替換。
有沒有辦法使用 sed 在繼續之前只使用變數替換一次模式?sed 在這種情況下使用正確的命令嗎?
如果您有 sed 的 GNU 實現,則可以使用(大寫)
R
命令(其特定於 GNU sed的命令之一)在每次匹配以ASF
第二個開頭的行時讀取並插入第一個文件的單行。然後刪除匹配的行:$ sed '/^ASF/{ R K3KFVfile.txt d }' ASF_file @K3KFV:1:1109:11598:25872 TAGGTCAAGCCCTCGGTCTATTAGTATTGGTCAGCTTAATACATTGCTGCACTTACACCT CCAACCTATCTACCTTGTTGTCTTCAAGGGACCTTACTCACTTGCGTTTTGGGATATCTT @K3KFV:1:2101:22577:15247 CGGATAGGGACCGAACTGTCTCACGACGTTCTGAACCCAGCTCGCGTACCGCTTTAATGG GCGAACAGCCCAACCCTTGGGACCTACTTCAGCCCCAGGATGCGATGAGCCGACATCGAG @K3KFV:1:1110:13477:13178 CCTTTTGCCTTTACACTCTTTGAATGGTTTCCAATCATTCTGAGGTGACCTTCGAGCGCC TCCGTTACTCTTTTGGAGGCGACCGCCCCAGTCAAACTGCCCGCCTGACATTGTCCTTCA
如果您願意,可以將其寫為單行:
sed -e '/^ASF/{R K3KFVfile.txt' -e 'd}' ASF_file
或者,您可以考慮使用 awk:
awk 'NR==FNR{K[FNR] = $0; next} /^ASF/{$0 = K[++n]} 1' K3KFVfile.txt ASF_file