我有一组包含制表符分隔值的文件,在最后但第三行,我有我想要的值。我用
提取了这个值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 :(得分: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]";
}