私のコマンドの出力は次のようなものです。
1540 "A B"
6 "C"
119 "D"
最初の列は常に数字で、その後にスペースが続き、その後に二重引用符で囲まれた文字列が続きます。
私の目的は、次のように2列目だけを取得することです。
"A B"
"C"
"D"
これを実現するために<some_command> | awk '{print $2}'
を使うつもりでした。しかし問題は、2列目のいくつかの値にスペースが含まれていることです。これは、フィールドを区切るawk
のデフォルトの区切り文字です。したがって、出力はめちゃくちゃになります。
"A
"C"
"D"
2番目の列の値(引用符付き)をきれいに取得するにはどうすればよいですか?
またはsedとregexを使用してください。
<some_command> | sed 's/^.* \(".*"$\)/\1/'
-F [field separator]
を使用して"
sの行を分割します。
awk -F '"' '{print $2}' your_input_file
またはパイプからの入力用
<some_command> | awk -F '"' '{print $2}'
出力:
A B
C
D
もしあなたが 'awk'以外の何かを使うことができるなら、代わりにこれを試してください
echo '1540 "A B"' | cut -d' ' -f2-
- dは区切り文字、 - fはカットするフィールドです。 - f2 - で2番目のフィールドを最後までカットします。
これは、コマンド出力「docker images」から特定の列を取り出すために機能します。
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 12543ced0f6f 10 months ago 122 MB
ubuntu latest 12543ced0f6f 10 months ago 122 MB
Selenium/standalone-firefox-debug 2.53.0 9f3bab6e046f 12 months ago 613 MB
Selenium/node-firefox-debug 2.53.0 d82f2ab74db7 12 months ago 613 MB
docker images | awk '{print $3}'
IMAGE
12543ced0f6f
12543ced0f6f
9f3bab6e046f
d82f2ab74db7
これは3列目を印刷します
そのためにawkは必要ありません。 Bashシェルでread
を使用すれば十分です。
some_command | while read c1 c2; do echo $c2; done
または
while read c1 c2; do echo $c2; done < in.txt
あなたがGNU awkを持っているなら、これはあなたが望む解決策です:
$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"
#!/usr/bin/python
import sys
col = int(sys.argv[1]) - 1
for line in sys.stdin:
columns = line.split()
try:
print(columns[col])
except IndexError:
# ignore
pass
それから、あなたがcoとスクリプトを命名すると仮定して、例えば、ファイルのサイズを取得するためにこのようなことをする(例はあなたがLinuxを使っていると仮定するが、スクリプト自体はOSに依存しない): -
ls -lh | co 5
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file