以下のように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()演算子を使用してコマンドを連結することですgrep
。grep
の終了ステータスを確認してください。
からman grep
:
終了ステータス
通常、終了状態は、行が選択されている場合は0、行が選択されていない場合は1、エラーが発生した場合は2です。
終了ステータスが 1 の場合、次のコマンドは実行されません。バラよりman bash
コマンド 1 && コマンド 2
command2は、command1が終了ステータス0(成功)を返した場合にのみ実行されます。
追加のヒント:
- -loops
for
を 1 つに結合できます。 - キーワードは-loopで、
for
ファイルループとネストできます。 - まず、ディレクトリを作成してスキップするように出力を直接リダイレクトします。
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
式です。