【问题标题】:how to add text to next line in tab separated file from other file?如何将文本添加到制表符分隔文件的下一行与其他文件?
【发布时间】:2016-08-10 06:08:26
【问题描述】:

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

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

【问题讨论】:

  • result1.tsv 等有多大?它们包含多少行?
  • resut1.tsv 包含大约 1000 行或更多行,但最后但第三行包含我需要的值。我用命令cat result1.tsv | tail -3 | head -1 > final1.tsv 提取了那些

标签: bash perl shell csv file-handling


【解决方案1】:

给你...

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

【讨论】:

  • 我有超过 4 个文件。
【解决方案2】:

试试这个:

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

【讨论】:

  • 感谢您的建议,我会试试这个。
【解决方案3】:

只要文件不是很大,最简单的方法就是将每个文件读入一个数组,然后从最后选择第三条记录

这可以为您解决问题。它在当前目录中查找与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]";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2011-05-30
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多