私のファイルはJSON形式で、次のようになります。
name: Tom species: mouse name: Stu species: cat name: Carter species: Dog
長い文字列ファイルがありますが、このリストから名前を抽出したいと思います。したがって、希望の出力は次のようになります。
Tom Stu Carter
たとえば、sedを使用して何度も失敗しようとしました。
cat alphabet | sed 's/^.*name: \(.*\) species*/\1/g'
出力:
Tom species: mouse name: Stu species: cat name: Carter : Dog
これを実行したい非常に大きなファイルがたくさんあるので、この問題を解決するための効率的な方法があれば良いでしょう。
答え1
入力が実際にJSONの場合は、JSONツールを使用する必要があります。
形式はawkに適しているようです。
$ awk '{for (i=2;i<=NF;i++) if ($(i-1)=="name:") print $i}' file
Tom
Stu
Carter
i
2番目のフィールドから始めて、行のすべてのフィールドを調べます。前のフィールドがそうであれば、name:
現在のフィールドが印刷されます。
すべての出力を1行に保持するには(末尾の空白なし):
$ awk '{for (i=2;i<=NF;i++) if ($(i-1)=="name:") {printf "%s%s", f,$i; f=" "}; print""}' file
Tom Stu Carter
答え2
GNU grepを使用してください:
grep -Po 'name: \K[^ ]*' file | tr '\n' ' '
またはGNU sedを使用してください。
sed -r 's/name: ([^ ]*) species: [^ ]*/\1/g' file
出力:
トム・シチュー・カーター