私は通常unix / bash / codeを初めて使用しており、異なるディレクトリにある同じ名前の複数のサンプルファイルを独自のディレクトリ(複数のデータセットの出力)にある新しいファイルにマージしようとしています。
そのために、listA(各サンプルファイルの名前)とlist B(新しくマージされたサンプルファイルの名前)の2つの配列を使用するスクリプトを作成しました。
私のコードは次のとおりです。
#!/bin/sh
listA=( old1 old2 old3 etc.)
listB=( new1 new2 new3 etc.)
i=0
for i in $listA $listB
do
cp ./folder1/$listA ./merged/$listB
cat ./folder2/$listA >> ./merged/$listB
cat ./folder3/$listA >> ./merged/$listB
cat ./folder4/$listA >> ./merged/$listB
((i=+1))
done
echo "Done stitching"
そのままlistAの最初の項目のファイルをlistBの最初のファイルに完全にマージするように見えますが、リストの後続の項目のプロセスを繰り返すことはありません。
これを期待どおりに実行するための提案はありますか?私の無知についてお詫び申し上げます。私はこのすべてが初めてで、学習プロセスを本当に楽しんでいます。ちょっと混乱しているだけです。
ベストアンサー1
短い答え
while IFS=$'\t' read -r old new; do cat folder*/"$old" > merged/"$new"; done <list.tsv
これはlist.tsv
、タブ区切りのソース(古い)ファイルとターゲット(新しい)ファイルのリストを想定しています。
説明する
while IFS=$'\t' read -r old new; FOO; done <list.tsv
list.tsv
:これは各行を読み取り、各行FOO
で操作を実行する一般的なシェル構成です。この場合、入力ファイルの区切り文字IFS
はtabです$'\t'
。つまり、行の最初のフィールドはに保存され、$old
2番目のフィールド(タブの後ろ)はに保存されます$new
。cat folder*/"$old" > merged/"$new"
:ファイルをリンクしてfolder*/"$old"
書き込みます。これはmerged/"$new"
ソースファイルがすべてにあると仮定しますfolder*
。folder1
folder2
- 他のスクリプトと同様に、実行する前に必ずテストしてみましょう。ファイルのサブセットを別のディレクトリにコピーしてから、短いバージョンの入力リストを使用してこれを実行できます
list.tsv
。結果を確認し、可能であれば実際に実行してみてください(ただしバックアップを維持してください!)。
提案されたソリューションに関する注意事項
私は、さまざまなコマンドがどのように機能するかを明確にするために、あなたが提案した解決策についていくつかのコメントを書きたいと思いました。これがあなたの理解に役立つことを願っています!
listA=( old1 old2 old3 etc.)
。これで配列が作成されます。一部のコンテンツにアクセスする方法を示します。ここ。 (ある程度)観察したように、を使用するとfor i in $listA…
最初の項目にのみアクセスします。for i in a b c
。これはa
、b
とを繰り返してc
それぞれに入れます$i
。たとえば、ブロック内で参照するfor i in a b c; do echo $i; done
ことは$listA
意味がありませんdo…done
。同様にi=0
、((i=+1))
使用法も一致しません。for
./folder1/$listA
。./
不要です。.
は現在のフォルダなので、ここでは何もしません。cat FOO >>
。cat
独自にリンクされます(したがって名前)。ファイルに追加された別のステートメントを作成する必要はありませんcat
。たとえば、>>
後ろに複数のファイルを一覧表示できます。cat
cat file1 file2 file3 > output_file