如何将文本添加到选项卡分隔文件中的下一行与其他文件?

时间:2016-04-18 13:15:14

标签: bash perl shell csv file-handling

我有一组包含制表符分隔值的文件,在最后但第三行,我有我想要的值。我用

提取了这个值
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

3 个答案:

答案 0 :(得分:0)

你去......

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

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分: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]";
}