私の前の質問に関連して....
最初の列に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
複数のファイルから行を取得するだけで、次のようになります。
grep -rEh `kgf` File_* > Output_file
しかし、これを行うと、output_file はランダムな順序で行を表示します。出力ファイルの最初の行は、File_1 ではなく、File_20 などからのものにすることができます。したがって、output_file には、出力ファイルの 1 行目に File_1 からの行を表示し、File_2 を出力ファイルの 2 行目に、File_3 を出力ファイルの 3 行目に表示するようにします。
これ知ってる人いますか?
前もって感謝します!
展開の順番はFile_*
ランダムではありません。シェル グロビングは、ファイル名をレキシカルに ( strcmp()
(バイトからバイトへの比較) またはstrcoll()
(ユーザーのロケール照合順序を使用して) シェルに応じて) 並べ替えます。
それは、しかし、それFile_10
が前 に来ることを意味しFile_2
ます。
番号順の場合、zsh
シェルを使用して次のようにすることができます。
grep -h '^kgf' File_*(n) > Output_file
どこn
グロブ修飾子は、オンにするnumericglobsort
オプション(別zsh
だけでグロブの拡張のために固有の機能)。
GNU システム (使用している-h
オプションは既に GNU 拡張機能です) で、任意のシェルを使用している場合は、次のようにして同様のことができます。
printf '%s\0' File_* | sort -zV | xargs -r0 grep -h '^kgf' > Output_file
ここでsort -V
は、の数値グロブ ソートと同様に動作するバージョンソートです。zsh
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加