2016-04-18 118 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]"; 
} 
相关问题