編輯:我在 Linux 集群中作業。
我有一個巨大的檔案,在第一列中列出了一個 ID,第二個是原始檔案中列的組合,在第 4-5-6 列中復制。輸入檔案如下所示:
1 1:71:T:C 0 71 C T
1 1:71:T:A 0 71 A T
1 1:72:GTGTGTGTT:G 0 72 G GTGTGTGTT
1 1:75:T:C 0 75 C T
1 1:75:T:* 0 75 * T
1 1:76:GTGTT:G 0 76 G GTGTT
1 1:76:GTGTT:* 0 76 * GTGTT
1 1:83:C:CAT 0 83 CAT C
1 1:87:CGT:C 0 87 C CGT
1 1:87:C:CGTGTGT 0 87 CGTGTGT C
U U:19874536:G:A 0 19874536 A G
U U:19874560:G:A 0 19874560 A G
U U:19874575:C:T 0 19874575 T C
U U:19874577:T:G 0 19874577 G T
U U:19874587:CA:C 0 19874587 C CA
U U:19874587:CAA:C 0 19874587 C CAA
U U:19874602:C:T 0 19874602 T C
U U:19876478:T:C 0 19876478 C T
U U:19876534:C:A 0 19876534 A C
U U:19876568:T:C 0 19876568 C T
22 X:29:G:GT 0 29 G GT
22 X:96:T:A 0 96 A T
22 X:146:A:G 0 146 G A
22 X:167:A:T 0 167 T A
22 X:168:T:C 0 168 C T
22 X:244:C:T 0 244 T C
22 X:253:C:A 0 253 A C
22 X:254:C:A 0 254 A C
22 X:330:G:T 0 330 T G
22 X:371:GGCGTTTACGT:G 0 371 G GGCGTTTACGT
.
.
.
我正在嘗試檢查第一列(ID)如何與第二列中的原始 ID 匹配,所以我只想列印與原始 ID 串列匹配的第一行(在第二列中)。我希望這很清楚!我在這里看到了這個解決方案,我認為它應該能夠幫助我,但我不熟悉 awk,我不知道如何編輯它,所以匹配只指 ID(在':'之前) 在第 2 列。
編輯:預期輸出:
1 1:71:T:C 0 71 C T
U U:19874536:G:A 0 19874536 A G
22 X:29:G:GT 0 29 G GT
.
.
.
uj5u.com熱心網友回復:
Perl 解決方案:
perl -F'/[\s:] /' -lane 'BEGIN { %matches = ( 22 => "X", ); } print if ( ( $F[0] eq $F[1] || $F[1] eq $matches{ $F[0] } ) && !$seen{ $F[0] } ); ' infile > outfile
Perl 單行器使用這些命令列標志:
-e:告訴 Perl 查找行內代碼,而不是在檔案中。
-n:一次回圈輸入一行,$_默認情況下將其分配給。
-l: 在執行行內代碼之前去除輸入行分隔符("\n"默認情況下在 *NIX 上),并在列印時附加它。:在空格或選項中指定的正則運算式上
-a拆分$_為陣列。: 拆分為on whitespace 或 on ,重復 1 次或多次,而不是 on whitespace。@F-F
-F'/[\s:] /'@F:
%matches = ( 22 => "X", );- 創建哈希%matches,它將匹配的 ID 從第 1 列映射到第 2 列。為了速度,它被放置在BEGIN { ... }塊中,在腳本開始時僅執行一次,然后運行后續代碼,該代碼針對每個輸入運行線。
!$seen{ $F[0] } : 僅當第一列中每個值第一次出現時才為真。
還請參見
perldoc perlrun::如何執行 Perl 解釋器:命令列開關
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/482068.html
下一篇:svg輪廓和填充
