我有一個這樣的串列:
#chrom start end seq
#chrom start end seq
#chrom start end seq
chr1 214435102 214435132 AAACCGGTCAGCTT...
chr1 214435135 214435165 TCAATGGACTGTTC...
#chrom start end seq
chr1 214873901 214873931 CCAAATCCCTCAGG...
正如所見,其中一些有結果(第 3 和第 4),而其中一些沒有(第 1 和第 2)
我要做的是首先閱讀以' #chrom '開頭的行并閱讀該行之后的行。如果下一行也以“ #chrom ”開頭,則列印 0,如果以其他內容開頭,則列印 1。并且對以“ #chrom ”開頭的每一行都執行此操作,而不傳遞任何內容。我有點想給那些有序列的標簽貼上標簽。我猜會有一種更簡單的方法,但到目前為止我可以創建的是兩行代碼;
awk '/#chrom/{getline; print}' raw.txt > nextLine.txt
awk '$1 == "#chrom" { print "0" } $1 != "#chrom" { print "1" }' nextLine.txt > labeled.txt
在labeled.txt 中的預期輸出;
0
0
1
1
我猜代碼的第二行運行良好。但是,raw.txt 和 nextLine.txt 中包含“ #chrom ”的行數不匹配。如果你能幫助我,我將不勝感激。
謝謝
uj5u.com熱心網友回復:
這應該這樣做:
awk 'BEGIN { chrom=0 } {
if ($1=="#chrom") {
if (chrom==1) print 0; else chrom=1; }
else {
if (chrom==1) print 1; chrom=0 }
}'
uj5u.com熱心網友回復:
一個awk想法:
awk '
{ if (prev=="#chrom") # for 1st line of input prev==""
print ($1 == "#chrom" ? 0 : 1) # use ternary operator to determine output
prev=$1
}
' raw.txt
或作為單行:
awk '{if (prev=="#chrom") print ($1 == "#chrom" ? 0 : 1); prev=$1}' raw.txt
這會產生:
0
0
1
1
uj5u.com熱心網友回復:
就像在生活中一樣,在軟體中,根據已經發生的事情而不是將要發生的事情來做事情要容易得多。所以不要根據輸入的 NEXT 行來撰寫需求,根據輸入的 PREVIOUS 行來撰寫需求,你會發現找出匹配的代碼要容易得多,而且代碼會比嘗試更簡單確定下一行輸入。
$ cat tst.awk
($1 == "#chrom") && (NR > 1) {
print ( prev == "#chrom" ? 0 : 1 )
}
{ prev = $1 }
END {
print ( prev == "#chrom" ? 0 : 1 )
}
$ awk -f tst.awk file
0
0
1
1
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/477325.html
上一篇:遇到第一個IF時如何停止并且在遇到第一個IF后沒有兩個歡迎警報
下一篇:如何減少三級條件
