複数のcsvファイルのgrepコマンドループに関する問題

複数のcsvファイルのgrepコマンドループに関する問題

以下のようにforループスクリプトを作成しました。

for file in *.csv
do
grep raxA $file > new_${file}
done && 
mkdir raxA && mv new_* raxA &&
for file in *.csv
do
grep raxB $file > new_${file}
done && 
mkdir raxB && mv new_* raxB &&
for file in *.csv
do
grep raxC $file > new_${file}
done && 
mkdir raxC && mv new_* raxC

このスクリプトは、すべてのキーワードが次に見つかったときに機能します。データセットファイルですが、ファイル内のキーワードのいずれかが欠落している場合は失敗します。データセット文書。これを完了するのに役立ちますか?grep指定されたキーワードがcsvファイルにありません。よろしくお願いします。

答え1

似たようなものが欲しいようです。

mkdir -p raxA raxB raxC &&
  awk '
    /raxA/ {print > ("raxA/new_"FILENAME)}
    /raxB/ {print > ("raxB/new_"FILENAME)}
    /raxC/ {print > ("raxC/new_"FILENAME)}' ./*.csv

答え2

問題は、コマンドの後に&&AND()演算子を使用してコマンドを連結することですgrepgrepの終了ステータスを確認してください。

からman grep

終了ステータス

通常、終了状態は、行が選択されている場合は0、行が選択されていない場合は1、エラーが発生した場合は2です。

終了ステータスが 1 の場合、次のコマンドは実行されません。バラよりman bash

コマンド 1 && コマンド 2

command2は、command1が終了ステータス0(成功)を返した場合にのみ実行されます。

追加のヒント:

  1. -loopsforを 1 つに結合できます。
  2. キーワードは-loopで、forファイルループとネストできます。
  3. まず、ディレクトリを作成してスキップするように出力を直接リダイレクトします。mv

答え3

他の人がすでにコマンドの問題を指摘しているので、シェルループを使用してこれを行う代替方法を提案します。避けるべき

awkパターンを検索し、一致する各パターンを複数のファイルに分割することもできます。

awk '{ matched=match($0, /rax[ABC]/); };
     matched{ dirname=substr($0, RSTART, RLENGTH);
              system("mkdir -p " dirname);
              print >(dirname"/new_"FILENAME);
              matched=0;
}' infile

バラよりman awk~のためmatch()substr()system()機能。

ファイルが.csvとして表示され、行全体ではなく特定の列のパターンを見つけるには、コマンドに追加し-F,(入力ファイルのフィールド区切り文字を指定)をに置き換えます$0(の行全体を表しますawk)。 csvファイルの対応する列番号が一致します。たとえば、パターンに一致する最初の列が使用され$1、2番目の列が使用され$2、3番目の列が使用される$3式です。

関連情報