2016-06-07 198 views
-1

我試圖刪除包含0/0或./的行。在標籤分隔的文本文件的第71列「FORMAT.1.GT」中。
我試過下面的代碼,但它不起作用。完成這個的正確方法是什麼?謝謝從文本文件中刪除包含特定文本的行

my $cmd6 = `fgrep -v "0/0" | fgrep -v "./." $Variantlinestsvfile > $MDLtsvfile`; print "$cmd6"; 
+0

是否要刪除整行? –

+0

是的,我想刪除整條線。感謝 – user3781528

+0

cat old_file.txt | sed'/\.\/\./d'| sed'/ 0 \/0/d'> new_file.txt –

回答

1

你可以稱之爲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腳本中調用該代碼。

+0

我很慚愧,因爲我只做了兩個很好的答案混搭。 – PerlDuck

+0

但這對我來說確實很有意義。謝謝:) – user3781528

+1

@PerlDog這是一篇非常好的文章,在我看來這是一個非常好的答案 - 你將所需的內容放在一起,並以合適的方式回答問題。我說的都很好:)我覺得有趣的是,我們從來沒有被告知過它是哪種方式。所以,即使在所有事情都說完了,過去和過去之後,我們仍然無法確定。 – zdim

1

由於您所需要的確切位置,並知道串lenghts substr可以找到它

perl -ne 'print if not substr($_, 70, 3) =~ m{(?:0/0|\./\.)}' filename 

這將打印線僅在三個字符長的字符串開始在第71欄不匹配的任0/0./.

周圍的正則表達式的分隔符{}允許我們使用/|內沒有逃脫。 ?:在那裏,所以()僅用於分組,而不是捕獲。如果沒有?:,它也可以正常工作,這只是爲了提高效率。

+0

True,if _column 71_表示:行中第71個字符 – PerlDuck

+0

@zdim 。如果不是substr($ _,70,3)=〜m {(?:0/0 | \ ./ \。)}'$ currenttsvfile> $ MDLtsvfile',我的$ cmd6 ='perl -ne'; print' $ cmd6「;當我從Perl腳本運行它時給了我錯誤 – user3781528

+0

@ user3781528對不起,我沒有回覆你的消息 - 我只是直到現在纔看到它(我認爲這是因爲有一段時間用戶名後?)你確實得到了一個解釋和你的好回答,所以一切都很好:) – zdim

0

試試吧!

awk '{ if ($71 != "./." && $71 != ".0.") print ; }' old_file.txt > new_file.txt 
+0

有人在這裏誰會責怪你_ [無用我們e的貓](http://stackoverflow.com/q/11710552/5830574)_。我沒有,但要做好準備。 – PerlDuck

+0

@PerlDog算入我的收藏。 – tripleee

+0

更好? –

1
perl -ane 'print unless $F[70] =~ m|([0.])/\1|' myfile > newfile 
+0

確實如果_column 71_表示:71st製表符分隔的字段。 – PerlDuck

+0

@PerlDog:我們被告知它是一個製表符分隔的文件,列號很少意味着字符位置。此外,如果涉及標籤,字符位置非常模糊,特別是當我們不知道標籤頁的尺寸時 – Borodin

+0

鑑於此,您的答案是正確的。但是zdim的回答也是高調的,所以有人一定認爲這是第71個角色。 – PerlDuck

0

在命令中的問題是,你正試圖捕捉其不產生輸出命令的輸出 - 所有的比賽都被重定向到一個文件中,因此,這就是所有的輸出是怎麼回事。

無論如何,從Perl調用grep只是古怪。在Perl中讀取文件本身就是一種方法。

如果你想要一個shell命令,

grep -Ev $'^([^\t]*\t){70}(\./\.|0/0)\t' file 

會做你所要求的更精確和優雅。但是,您也可以在Perl程序中直接使用該正則表達式。

相關問題