2017-10-12 34 views
1

私の問題は、サイズが0より大きいテキストファイル名の最後から行番号を抽出する必要があります。行番号の、私はマスターテキストファイルから行を抽出する必要があります。複数のテキストファイル名から行を抽出し、それらの行をテキストファイルから取り出します - Linux

以下のコマンドを使用して最初の手順を実行する方法を理解しました。これは、サイズが0より大きい.sh.eを含むすべてのファイルを見つけて、最後の数文字を引っ張ってjobIDとsedコマンドを削除します先頭の7文字をオフにします(これはもう少しエレガントに行うこともできます)。

ファイル名例:

Job_2017-09-25-08-50-28-ahill.sh.e1191.92 
Job_2017-09-25-08-50-28-ahill.sh.e1191.102 
Job_2017-09-25-08-50-28-ahill.sh.e1191.252 
Job_2017-09-25-08-50-28-ahill.sh.e1191.301 

find . -name "*.sh.e*" -type f -size +0c | grep -E -o ".e1191.{0,10}" | sed 's/^.\{7\}//' 

92 
102 
252 
301 

私はその後、私に私の仕事の元のファイルの場所を指示するテキストファイルから行を抽出する必要があります。

これをsedまたはawkに渡して、マスターログを解析する際に問題があります。私は以下を試しました:

find . -name "*.sh.e*" -type f -size +0c | grep -E -o ".e1191.{0,10}" | awk (NR=sed s/^.\{7\}//) ../temp/files.2017-09-26.txt 

find . -name "*.sh.e*" -type f -size +0c | grep -E -o ".e1191.{0,10}" | sed -n "$(sed 's/^.\{7\}//')p" ../temp/files.2017-09-26.txt 

find . -name "*.sh.e*" -type f -size +0c | grep -E -o ".e1191.{0,10}" | awk "NR==$(sed 's/^.\{7\}//')" ../temp/files.2017-09-26.txt 

すべては失敗してしまいます。私はExcelでこれを行うことができますが、頻繁に行う必要があるため、コマンドラインからこれを実行したいと考えています。

おかげ

+0

「私は、私に私の仕事の元のファイルの場所を指示するテキストファイルから行を抽出する必要があります。」このフレーズは不明です。最終的な結果は何でしょうか? – RomanPerekhrest

+0

最終結果は、../temp/files.2017-09-26.txtファイルから、行(s)X(最初のコマンドから得た)の文字列のリストです。元のWAVファイルへのパスの大きなリストです。 –

+0

となるので、スクリプトは '/ temp/files.2017-09-26.txt'ファイルを数字' 92'、 '102'などで検索し、それらの数字を含む一致する行を出力する必要があります。 – RomanPerekhrest

答えて

1

最適化され、高速です。find溶液:

find . -type f -name "*.sh.e[0-9]*" -size +0c -exec sh -c 'fn=$1; n=${fn##*.}; \ 
     sed -n "$n p" ../temp/files.2017-09-26.txt' _ {} \; 

  • fn=$1からfn変数はによって返されたファイル名が付与されている見つけるコマンド

  • n=${fn##*.} - (ファイル名から必要な数値サフィックスを抽出し、すなわち92102など)

+0

私は彼が何を達成したいのか分かりません。取り出された接尾辞は行番号ではありません抽出する?これらの番号のgrepだけですか? – Esteban

+0

@Esteban、質問 – RomanPerekhrest

+0

の下のコメントを参照してください私は知っているが、彼は2回(質問に1つ、最初のコメントに1つ)、それは行番号だったので、彼はあなたが "マッチングライン" – Esteban

1

ないきれいなコマンドが、それが動作するはずです:

sed -n $(find . -name "*.sh.e*" -type f -size +0c |rev |cut -d'.' -f1 | tr "\n" " " | sed -e 's/ /p;/g' -e 's/;$//g') < ../temp/files.2017-09-26.txt 

それは何:

  • find . -name "*.sh.e*" -type f -size +0c:ファイル
  • rev
  • 一覧表示:の文字を逆にファイル名
  • cut -d'.' -f1:区切られた最初のフィールドを.で切り取ります。ライン
  • tr "\n" " "は:スペース
  • sed 's/ /p;/g'することによって、新しい行を置き換える:p;
  • sed 's/;$//g'でスペースを置き換える:ストリップ
  • ^ ;最後

それはsed -n 'np;mp' < file.txtコマンドで必要なパターンを作成し、 nおよびmは、行番号

+0

私は930の結果を持っており、あなたのコマンドは850件のリストしかないようです。 find。 -name "* .sh.e *" -type f -size + 0c | wc -l 理由がわかりません。 –

+0

ファイルサンプルなしでどこでエラーが発生するかわかりません。私は2つのファイルと5行のログでコマンドを嘲笑した;)。最初にコマンドをテストするために、各ファイルに対してsedを実行しようとするとよいでしょう。 – Esteban

+0

@MasaAsh 'find。 -name "* .sh.e *" -type f -size + 0c | rev | cut -d '。' -f1 | xargs -I%sed -n%p ../ temp/files.2017-09-26.txt' – Esteban

関連する問題