前の質問に関連しています...
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
を拡張するオプションを開きます。numericglobsort
zsh
GNUシステム(-h
使用しているオプションはすでにGNU拡張)を使用していて、シェルを使用している場合は、次のようにできます。
printf '%s\0' File_* | sort -zV | xargs -r0 grep -h '^kgf' > Output_file
sort -V
一つはどこにありますか?バージョンzsh
sortはsのように動作します。数字グローバルソート。