2017-02-20 25 views
1

私はいくつかのファイルを、ディレクトリにかかわらず同様の命名パターンを持つ単一のフォルダにマージしようとしています。次のようにシェルスクリプトで同じ名前のファイルをマージしてマージするにはどうすればよいですか?

ファイル構造は次のとおりです。

20170219-A20-L1-AB1234_S1_R1_001.txt 
20170211-B21-L3-AB1234-2_S1_R1_001.txt 
20170210-C20-L1-AB1234-3_S1_R1_001.txt 
20170211-B21-L3-AB1234-2_S2_R1_001.txt 
20170210-C20-L1-AB1234-3_S2_R1_001.txt 

私の基準は_S1_S2を含むファイルを見つける、とにすべての新しい単一のファイルに_S1ファイルとすべての_S2ファイルをマージすることです新しい単一ファイル。

私の期待される出力は20170219-B21-L3-AB1234-2_S1_R1_001_merge.txt20170219-B21-L3-AB1234-2_S2_R1_001_merge.txtです。私は、マージされたファイル名のための特定の要件はありませんが、私はこれらのマージされたファイルを同じフォルダにしたい。

私はgrepcutコマンドを使用しようとしていますが、forループが機能していません。シェルの正規表現を理解するのは難しいと思っています。

論理を構築するのに手伝ってください。

+4

コードを投稿すると、デバッグに役立ちます。 – Guest

+1

また、 "うまくいかない"というのはあなたが得ることができるほど曖昧なものです –

+1

@anonその編集は、HTMLタグがファイル構造の一部であるように見えます。おそらく意図ではありません。 –

答えて

4

を従来のソリューションのいずれもが、あなたが探しているファイルが作業ディレクトリにある場合に適しているが、他のディレクトリからすべてのファイルをマージしません。あなたの問題を再現するために私は、次の、そしてあなたの最初の要求ごとにそれを解決しようとする:あなたの仕様に従って

作成されたファイル:

$ touch $(date +%Y%m%d)_{A,B}{20,21}_L{1,3}_AB1234_{1,3}_S{1,2}_R1_001.txt 
$ touch $(date +%Y%m%d)_{A,B}{20,21}_L{1,3}_AB1234_S{1,2}_R1_001.txt 
$ ls | wc -l 
48 

はランダムなテキストの48行で引数myTextを作成

はLoremのイプサムを生成:

$ ls -t1 | awk '{print NR" "$0}' | while read i j; do echo "${myText}" | awk -v var=${i} 'NR==var {print}' >> ${j}; done 
$ for i in `ls -t1`; do echo -n " ${i}: "; cat ${i}; done 
20170219_B21_L3_AB1234_3_S1_R1_001.txt: This is additional line two 
20170219_B21_L3_AB1234_3_S2_R1_001.txt: line three 
... 
20170219_A20_L3_AB1234_S1_R1_001.txt: Phasellus ut quam eu lacus aliquet vehicula. 
20170219_A20_L1_AB1234_S1_R1_001.txt: Proin nec orci accumsan, pharetra sapien sed, gravida arcu. 
20170219_B21_L3_AB1234_S2_R1_001.txt: Lorem ipsum dolor sit amet, consectetur adipiscing elit 

$ echo "${myText}" | wc -l 
    48 

myTextから各ラインの各ファイル1を与えました

その後、私はすべて... S1 ...と... S2 ...ファイルをマージしました(これは私の基準と一致するファイルを見つけ出しました。追加の代わりに、上書き、代わりにcat > filecat >> fileを使用する - スクリプトを再実行する必要があります前にファイルがクリーンアップされている場合に応じて):

$ find ~ -type f -iname "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[A,B]*S1*" -exec cat > AB1234_S1_R1_001_merged.txt {} + 
$ find ~ -type f -iname "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[A,B]*S2*" -exec cat > AB1234_S2_R1_001_merged.txt {} + 

結果:

$ for i in `ls | grep merged`; do echo; echo "--- ${i} ---"; cat ${i}; done 

--- AB1234_S1_R1_001_merged.txt --- 
Donec et ante tempor, hendrerit est ut, egestas massa. 
Donec laoreet erat a sapien finibus venenatis. 
Etiam eget urna eu ipsum dapibus aliquet. 
Phasellus ut quam eu lacus aliquet vehicula. 
Phasellus sed lorem ac odio rutrum vehicula. 
Aliquam ac eros ut risus fringilla fringilla. 
Curabitur a purus ultricies sem venenatis auctor. 
Praesent dignissim justo non diam ultrices, nec fermentum lectus dictum. 
Donec imperdiet mi sit amet quam iaculis rhoncus. 
Nam vitae neque vehicula, consectetur dui porttitor, placerat libero. 
Nulla eget diam iaculis augue interdum posuere. 
Fusce a diam ac neque accumsan sagittis. 
Sed feugiat mi eget augue euismod, et laoreet urna dictum. 
This is additional line two 
Vestibulum egestas tellus non justo fringilla viverra eget eu neque. 
Aliquam porttitor nisi nec laoreet vestibulum. 
Donec congue diam ut leo commodo mattis. 
Quisque egestas odio sit amet diam efficitur, non accumsan magna blandit. 
Donec convallis metus at iaculis pellentesque. 
Nam a ligula venenatis, consectetur lectus et, dictum erat. 
Proin nec orci accumsan, pharetra sapien sed, gravida arcu. 
Curabitur volutpat nibh nec leo tempus, at sagittis lacus euismod. 
Mauris blandit sem ac lectus varius lobortis. 
In eu ipsum et felis lobortis dictum. 

--- AB1234_S2_R1_001_merged.txt --- 
Aenean id orci sit amet lacus tincidunt molestie. 
Duis pretium tellus dapibus lorem rhoncus, at tincidunt mauris pellentesque. 
Integer hendrerit mauris sit amet nunc aliquam, id congue justo pulvinar. 
Praesent dapibus augue ac enim consequat, vitae feugiat enim scelerisque. 
This is additional line one 
Sed sit amet dolor accumsan, commodo magna at, aliquet neque. 
Quisque porttitor sapien sed orci vulputate, ac porta ante sollicitudin. 
In malesuada leo sit amet purus accumsan porttitor commodo eu eros. 
Integer ut odio elementum, viverra velit at, molestie nulla. 
Suspendisse suscipit lorem id suscipit consectetur. 
Donec vulputate nibh eget imperdiet volutpat. 
Curabitur sit amet libero eget nulla viverra iaculis sit amet eget eros. 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Maecenas imperdiet nisl quis arcu blandit, sed pretium mi auctor. 
Sed sit amet nunc faucibus, ultricies elit quis, sodales magna. 
Nulla pharetra mauris eu quam sollicitudin ornare in et metus. 
Ut convallis nibh in tempus fringilla. 
In ornare erat quis sodales hendrerit. 
Phasellus molestie erat commodo est venenatis, ullamcorper tempus elit hendrerit. 
Nam mollis ante in purus suscipit, quis facilisis risus efficitur. 
Integer pellentesque sem eget diam ultrices, eget vulputate ante pharetra. 
Mauris ac nisl vitae sapien lacinia ornare nec nec felis. 
line three 
Sed dapibus ipsum eu purus interdum, at varius libero ornare. 

この回答をしました質問?

2

このような何か:forの文(この場合はS1 & S2)で与えられたリストを使用して

#!/bin/bash 

for i in 'S1' 'S2' 
do 
    cat *_"$i"_R[0-9]*_[0-9]*.txt > "$i".txt 
done 

、猫の正規表現パターンを使用して、ファイルとの各要素のための単一のファイルに出力を送信リスト。マージされた出力ファイルはS1.txtS2.txtになります。必要に応じて正規表現を使用してより厳格にすることができます。以下は

1

は役立ちます:

cat *_s1* > 20170219-B21-L3-AB1234-2_S1_R1_001_merge.txt 
cat *_s2* > 20170219-B21-L3-AB1234-2_S2_R1_001_merge.txt 
関連する問題