複数のファイルの文字列を含む行をファイルの順序で取得する方法は?

複数のファイルの文字列を含む行をファイルの順序で取得する方法は?

前の質問に関連しています...

5000ファイルの最初の列に特定の文字列を含む行を取得したいと思います。しかし、出力ファイルの行を入力ファイルの順序で表示したいと思います。例えば、

ファイル1

agd fkg fls  ofk
ggs kkg ikg  gkl
bsg ksf olg  lzj
many more lines,,,
kgf kkg ikg  lgk

ファイル_2

gik zlg olg  pzk
ppl sjg gol  dzj
zjg iwj bmh  hgi
many more lines,,,
kgf wlg ugk  lkf

より多くのファイルがあります。

結果ファイル

kgf kkg ikg lgk  -- This line from the File_1
kgf wlg ugk lkf  -- This is from the File_2
more lines...
kgf ald fig wdg  -- This last line is from the File_5000 

以下のように複数のファイルから1行を取得します。

grep -rEh `kgf` File_* > Output_file

ただし、これを行うと、output_fileは行をランダムな順序で表示します。出力ファイルの最初の行は、File_1の代わりにFile_20または他のファイルから来ることができます。だから私は、output_fileがFile_1の行を出力ファイルの最初の行としてマークし、File_2を出力ファイルの2番目の行として、File_3を出力ファイルの3番目の行として表示したいと思います。

これを知っている人はいますか?

よろしくお願いします!

答え1

拡張順序はFile_*ランダムではありません。シェルワイルドカードは、シェルに従ってstrcmp()(バイト対バイト比較)または(ユーザーのロケールの組み合わせ)を使用してファイル名を語彙的にソートします。strcoll()

File_10とにかく来るという意味だ今後 File_2

数値順の場合は、zshシェルを使用して次のことができます。

grep -h '^kgf' File_*(n) > Output_file

glob修飾子は、そのglob(別の特定の機能)のみnを拡張するオプションを開きます。numericglobsortzsh

GNUシステム(-h使用しているオプションはすでにGNU拡張)を使用していて、シェルを使用している場合は、次のようにできます。

printf '%s\0' File_* | sort -zV | xargs -r0 grep -h '^kgf' > Output_file

sort -V一つはどこにありますか?バージョンzshsortはsのように動作します。数字グローバルソート。

関連情報