我試圖刪除包含0/0或./的行。在標籤分隔的文本文件的第71列「FORMAT.1.GT」中。
我試過下面的代碼,但它不起作用。完成這個的正確方法是什麼?謝謝從文本文件中刪除包含特定文本的行
my $cmd6 = `fgrep -v "0/0" | fgrep -v "./." $Variantlinestsvfile > $MDLtsvfile`; print "$cmd6";
我試圖刪除包含0/0或./的行。在標籤分隔的文本文件的第71列「FORMAT.1.GT」中。
我試過下面的代碼,但它不起作用。完成這個的正確方法是什麼?謝謝從文本文件中刪除包含特定文本的行
my $cmd6 = `fgrep -v "0/0" | fgrep -v "./." $Variantlinestsvfile > $MDLtsvfile`; print "$cmd6";
你可以稱之爲borodin的一行,zdim說。哪一個適合你是不明確的,因爲你不知道第71列是指該行的第71個製表符分隔字段還是該行的第71個字符。考慮
12345\t6789
現在什麼是第二列?它是字符2
還是字段6789
?鮑羅廷的回答假定它是6789
,而zdim假設它是2
。兩種解決方案都可以解決這兩種情況,但這些解決方案都是獨立解決方案它自己的程序可以從命令行運行。
如果要整合到你的Perl腳本,你可以做這樣的:
替換此行:
my $cmd6 = `fgrep -v "0/0" | fgrep -v "./." $Variantlinestsvfile > $MDLtsvfile`; print "$cmd6";
在這個片段:
open(my $fh_in, '<', $Variantlinestsvfile) or die "cannot open $Variantlinestsvfile: $!\n";
open(my $fh_out, '>', $MDLtsvfile) or die "cannot open $MDLtsvfile: $!\n";
while(my $line = <$fh_in>) {
# character-based:
print $fh_out $line unless (substr($line, 70, 3) =~ m{(?:0/0|\./\.)});
# tab/field-based:
my @fields = split(/\s+/, $line);
print $fh_out $line unless ($fields[70] =~ m|([0.])/\1|);
}
close($fh_in);
close($fh_out);
使用基於字符的行或基於標籤/字段的行。不是都!
Borodin和zdim將這段代碼濃縮爲一行代碼,但不能從Perl腳本中調用該代碼。
我很慚愧,因爲我只做了兩個很好的答案混搭。 – PerlDuck
但這對我來說確實很有意義。謝謝:) – user3781528
@PerlDog這是一篇非常好的文章,在我看來這是一個非常好的答案 - 你將所需的內容放在一起,並以合適的方式回答問題。我說的都很好:)我覺得有趣的是,我們從來沒有被告知過它是哪種方式。所以,即使在所有事情都說完了,過去和過去之後,我們仍然無法確定。 – zdim
由於您所需要的確切位置,並知道串lenghts substr
可以找到它
perl -ne 'print if not substr($_, 70, 3) =~ m{(?:0/0|\./\.)}' filename
這將打印線僅在三個字符長的字符串開始在第71欄不匹配的任0/0
和./.
周圍的正則表達式的分隔符{}
允許我們使用/
和|
內沒有逃脫。 ?:
在那裏,所以()
僅用於分組,而不是捕獲。如果沒有?:
,它也可以正常工作,這只是爲了提高效率。
True,if _column 71_表示:行中第71個字符 – PerlDuck
@zdim 。如果不是substr($ _,70,3)=〜m {(?:0/0 | \ ./ \。)}'$ currenttsvfile> $ MDLtsvfile',我的$ cmd6 ='perl -ne'; print' $ cmd6「;當我從Perl腳本運行它時給了我錯誤 – user3781528
@ user3781528對不起,我沒有回覆你的消息 - 我只是直到現在纔看到它(我認爲這是因爲有一段時間用戶名後?)你確實得到了一個解釋和你的好回答,所以一切都很好:) – zdim
在命令中的問題是,你正試圖捕捉其不產生輸出命令的輸出 - 所有的比賽都被重定向到一個文件中,因此,這就是所有的輸出是怎麼回事。
無論如何,從Perl調用grep
只是古怪。在Perl中讀取文件本身就是一種方法。
如果你想要一個shell命令,
grep -Ev $'^([^\t]*\t){70}(\./\.|0/0)\t' file
會做你所要求的更精確和優雅。但是,您也可以在Perl程序中直接使用該正則表達式。
是否要刪除整行? –
是的,我想刪除整條線。感謝 – user3781528
cat old_file.txt | sed'/\.\/\./d'| sed'/ 0 \/0/d'> new_file.txt –