2012-10-22 131 views
0

我有以下類型的數據的文本文件,在它下面:解析數據

Example: 
10212012115655_113L_-247R_247LRdiff_0; 
10212012115657_114L_-246R_246LRdiff_0; 
10212012115659_115L_-245R_245LRdiff_0; 
10212012113951_319L_-41R_41LRdiff_2; 
10212012115701_116L_-244R_244LRdiff_0; 
10212012115703_117L_-243R_243LRdiff_0; 
10212012115705_118L_-242R_242LRdiff_0; 
10212012113947_317L_-43R_43LRdiff_0; 
10212012114707_178L_-182R_182LRdiff_3; 
10212012115027_278L_-82R_82LRdiff_1; 

我想有

1) _2 _3 _1 at the end of it into another file along with 
2) stripping out the semicolon at the end of it. 

所以,在所有的數據線拷貝結束文件中的數據將是

Example: 
10212012113951_319L_-41R_41LRdiff_2 
10212012114707_178L_-182R_182LRdiff_3 
10212012115027_278L_-82R_82LRdiff_1 

我該如何去做這件事? 我使用的是Linux操作系統Ubuntu 10.04 64位

感謝

回答

2

下面是使用sed一個辦法:

sed -n 's/\(.*_[123]\);$/\1/p' file.txt > newfile.txt 

下面是使用grep一種方法:的newfile.txt

grep -oP '.*_(1|2|3)(?=;$)' file.txt > newfile.txt 

內容:

10212012113951_319L_-41R_41LRdiff_2 
10212012114707_178L_-182R_182LRdiff_3 
10212012115027_278L_-82R_82LRdiff_1 
+0

尼斯,甚至沒有想到用'本身sed',雖然我用'sed'的正則表達式來拉分號= P。 +1! – newfurniturey

+0

謝謝!我已經更新了我的答案,你甚至可以自己使用'grep'。 – Steve

1

如果格式始終是相同的,並且只有一個分號每一行的最後,您可以使用grep找到行,然後sed更換;

grep -P "_(1|2|3);$" your_file | sed 's/\(.*\);$/\1/' > your_new_file 

grep命令-P告訴它使用Perl的正則表達式解釋器解析。或者,您可以使用egrep(如果可用)。

0
tr -c ";" "\n" > newfile 
grep '*_[123]$' newfile > newfile 

這應該工作。起初,你把所有;\n並保存結果到目標文件。然後使用grep只匹配包含*_[123]末的線條和保存匹配結果到該文件再次,將取代所有之前的數據。在我用$結束標誌。你

的情況下,使用trgrep一些例子並不熟悉它。

1

這裏如果你有興趣awk的解決方案:

awk '/_[321];$/{gsub(/;/,"");print}' your_file 

如下測試:

> awk '/_[321];$/{gsub(/;/,"");print}' temp 
10212012113951_319L_-41R_41LRdiff_2 
10212012114707_178L_-182R_182LRdiff_3 
10212012115027_278L_-82R_82LRdiff_1 
+0

,將工作給予OP的樣本數據,但吹毛求疵 - 因爲你只想要刪除一個;你應該使用sub()而不是gsub(),因爲你只想在行尾刪除一個分號,你應該在RE中包含它並使用sub(/; $ /,「」)。 –