2016-04-18 54 views
-1

我有一組文件包含製表符分隔值,在最後但第三行,我有我想要的值。我已提取的值與如何將文本添加到製表符分隔的文件中的下一行與其他文件?

cat result1.tsv | tail -3 | head -1 > final1.tsv 
cat resilt2.tsv | tail -3 | head -1 >final2.tsv 

.....等等(我幾乎30-40文件) 我想要的最終TSV文件下一行新的單個文件的內容。

我試圖

cat final1.tsv final2.tsv > final.tsv 

,但這個工程的難寫的所有文件名的文件的數量有限。 我試圖把文件名作爲變量放在一個循環中,但不起作用。

final1.tsv包含:

270 96 284 139 271 331 915 719 591 1679 1751 1490 968 1363 1513 1184 1525 490 839 425 967 855 356 

final2.tsv包含:

1 1 0 2 6 5 1 1 11 7 1 3 4 1 0 3 2 1 0 3 2 1 28 

的所有文件(final1.tsv,final2.tsv,final3.tsv,final5 .....含有相同數量的列但不同的值) 我想每個文件的行合併到新文件中,如

final.tsv

final1 270 96 284 139 271 331 915 719 591 1679 1751 1490 968 1363 1513 1184 1525 490 839 425 967 855 356 
final2 1 1 0 2 6 5 1 1 11 7 1 3 4 1 0 3 2 1 0 3 2 1 28 
final3 270 96 284 139 271 331 915 719 591 1679 1751 1490 968 1363 1513 1184 1525 490 839 425 967 855 356 
final4 1 1 0 2 6 5 1 1 11 7 1 3 4 1 0 3 2 1 0 3 2 1 28 
+0

有多大'result1.tsv'等?它們包含多少行? – Borodin

+0

'resut1.tsv'包含大約1000或更多行,但最後卻包含了我需要的值。我用命令 'cat result1.tsv |尾-3 |頭-1> final1.tsv' – anonymous

回答

0

在這裏你去...

for f in final{1..4}.tsv; 
do 
    echo -en $f'\t' >> final.tsv; 
    cat $f >> final.tsv; 
done 
+0

我有超過4個文件。 – anonymous

0

試試這個:

rm final.tsv 
for FILE in result*.tsv 
do 
    tail -3 $FILE | head -1 >> final.tsv 
done 
+0

謝謝你的建議,我會試試這個。 – anonymous

0

只要文件不是很大,這是最簡單的每一個文件讀入一個數組,並選擇從結尾開始的第三條記錄

這可以解決您的問題。它會在匹配result*.tsv當前目錄中的所有文件,並從他們每個人的寫入所需的行final.tsv

use strict; 
use warnings 'all'; 

my @results = sort { 
    my ($aa, $bb) = map /(\d+)/, ($a, $b); 
    $aa <=> $bb; 
} glob 'result*.tsv'; 

open my $out_fh, '>', 'final.tsv'; 

for my $result_file (@results) { 

    open my $fh, '<', $result_file or die qq({Unable to open "$result_file" for input: $!}; 
    my @data = <$fh>; 

    next unless @data >= 3; 

    my ($name) = $result_file =~ /([^.]+)/; 
    print { $out_fh } "$name\t$data[-3]"; 
} 
相關問題