2016-04-18 3 views
-1

ファイルのセットにはタブで区切られた値が含まれていますが、最後の行では3行目に希望の値があります。 (私はほとんど30〜40ファイルを持っている)のように、私は新しい1つのファイルに次の行の最後のTSVファイルの内容を欲しい .....他のファイルからタブで区切られたファイルの次の行にテキストを追加する方法は?

cat result1.tsv | tail -3 | head -1 > final1.tsv 
cat resilt2.tsv | tail -3 | head -1 >final2.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

にそれらのそれぞれから、必要な行を書き込み?それらに何行含まれていますか? – Borodin

+0

'resut1.tsv'には約1000行以上含まれていますが、最後には3行目に必要な値が入っています。コマンドでそれらを抽出しました 'cat result1.tsv |テール-3 | head -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

限り、ファイルが巨大ではないとして、それが配列に各ファイルを読み込み、選択するのが最も簡単ですが最後から3番目のレコード

これはあなたの問題を解決します。それはresult*.tsvと一致し、現在のディレクトリ内のすべてのファイルを探し、 `result1.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]"; 
} 
関連する問題