ループを介して一致する複数のファイルを編集してマージする方法は?

ループを介して一致する複数のファイルを編集してマージする方法は?

*編集:すべての出力をファイルに追加することにしました。

編集するCSVファイルが40個あります。 20形式は、docA.csv、docB.csvなど、1文字だけが別の名前と一致します。他の20個もpair_docA.csv、pair_docB.csvなどの名前で一致します。

docA.csvとpair_docA.csvを編集して結合するコードがあります。上記の2つのファイルを呼び出して編集し、CombinedA.csvという名前で結合し、次に移動するループを作成するのが困難です。それから右。

誰でも基本的なbashスクリプトを書くのに役立ちますか?これが私が今まで持っているものです。私は1つのforループを試しましたが、今2つ(おそらく3つ)のforループを試しています。私はそれを繰り返し維持することを好みます。

set -x
DIR=/path/to/file/location

for file in `ls $DIR/doc?.csv`
do

#code to edit the doc*.csv files ie $file
#output is called temp_doc*.csv

done

for pairdoc in `ls $DIR/pair_doc?.csv`
do

#code to edit the piar_doc*.csv files ie $pairdoc
#output is called temp_pair*.csv

done

#still need to combine the files. I have the join written for a single iteration, 
#but how do I loop the code to save each join as a different file corresponding
#to combined*.csv

答え1

set -x
DIR=/path/to/file/location
TMPDIR=$(mktemp -d)
rm -f -- "$DIR/combined.csv"

for file in "$DIR"/doc?.csv
do

doc=${file##*/}

#------------ doc processing
temp_doc="$TMPDIR/$doc"

your_code "$file"  > "$temp_doc"

#------------- pair doc processing
pair="$DIR/pair_$doc"
temp_pair="$TMPDIR/$pair"

your_code  "$pair" >  "$temp_pair"


#--------- combine doc+pair
combined="$DIR/combined${doc/doc/}"

your_code "$temp_doc"  "$temp_pair"  > "$combined"
 

cat "$combined" >> "$DIR/combined.csv"
done

注:上記の3つのステップの処理コードをあなたの処理コードに置き換えてください。

  • doc=${file##*/} 上記の構造で行うことは、シェル変数 $file で左から始まり、最後の/アスタリスクを削除するだけです。ヘッダーは$ DIRであることを忘れないでください。単純なデフォルト名を取り、結果を別のシェル変数 $doc に保存します。

  • すべてを1つのファイルにリンクするために最後のcat行を追加しました。

答え2

免責事項:これは決して最善の方法でも、いかなる観点からも最善の方法ではありませんが、この種の問題について考える方法を示しています。このようなことを一度だけ実行しても大丈夫ですが、スクリプトを書く人以外の人を使用してはいけません。他の人が使用しているコンピュータに入れないでください。基本原則は、ほとんどの作業を最小のステップに分割するときに簡単であると考えることです。

この投稿にすべての繰り返しを保存したので、非常に簡単な変更で結果がどのように変わるかを確認して比較できます。入力テストを開始する必要があるときに問題が発生しますが、そのコードを便利にするコードはありません。さまざまなファイル名への入力の追加、入力パラメータの複数のチェックの追加など、もう一度お話しますが、このようなことを一度することは大丈夫ですが、繰り返されることに対する完全な答えとして使用してはいけません。

#!/bin/bash
    
     for n in $(ls -1 doc*.csv);
     do
     cat $n >> combinded$n
     cat pair_$n >> combinded$n
  
     mv combinded$n $(echo combinded$n | sed 's/doc//g')
     done

docA.csvこれにより、名前付きファイルがインポートされ、名前pair_docA.csv付きファイルに結合され、元のcombinedA.csvファイルは変更されません。同じ命名パターンに従うディレクトリ内のすべてのファイルに対してこれを行います。

注:これはファイルと同じディレクトリで実行する必要があり、ファイル名はここに示すように指定する必要があります。

テスト:

doc_A.csv doc_B.csvと_docA.csvと_docB.csv

出力:

組み合わせA.csv組み合わせB.csv

編集:すべてをファイルに出力することに関する質問に答えるために、次のファイルに書き込みます。combinded.csv

#!/bin/bash
for n in $(ls -1 doc*.csv);
do
cat $n >> combinded.csv
cat pair_$n >> combinded.csv
done

これは、次の形式のファイルに出力されます。

  • docA.csv
  • piar_docA.csv
  • docB.csv
  • pair_docB.csv

など。ファイルの最後まで。

編集:入力と出力が少し難しい場合にディレクトリを追加するには、パラメータをテストする必要があります。このスクリプトは2つのパラメータを使用します。最初のパラメータはファイルを含むディレクトリで、2番目のパラメータは出力ファイルの場所です。パラメータは必須です。

  #!/bin/bash

  dir=$1
  out=$2
  cd $1
  for n in $(ls -1 doc*.csv);
  do
  cat $n >> combinded$n
  cat pair_$n >> combinded$n

  mv combinded$n $out/$(echo combinded$n | sed 's/doc//g')
  done

例: ./script.sh /path/to/files /path/to/output

両方のパラメータが必要です。

関連情報