web-dev-qa-db-ja.com

コマンド出力から2列目を取得する方法

私のコマンドの出力は次のようなものです。

1540 "A B"
   6 "C"
 119 "D"

最初の列は常に数字で、その後にスペースが続き、その後に二重引用符で囲まれた文字列が続きます。

私の目的は、次のように2列目だけを取得することです。

"A B"
"C"
"D"

これを実現するために<some_command> | awk '{print $2}'を使うつもりでした。しかし問題は、2列目のいくつかの値にスペースが含まれていることです。これは、フィールドを区切るawkのデフォルトの区切り文字です。したがって、出力はめちゃくちゃになります。

"A
"C"
"D"

2番目の列の値(引用符付き)をきれいに取得するにはどうすればよいですか?

118
Qiang Xu

またはsedとregexを使用してください。

<some_command> | sed 's/^.* \(".*"$\)/\1/'
28
catay

-F [field separator]を使用して"sの行を分割します。

awk -F '"' '{print $2}' your_input_file

またはパイプからの入力用

<some_command> | awk -F '"' '{print $2}'

出力:

A B
C
D
161
Alex

もしあなたが 'awk'以外の何かを使うことができるなら、代わりにこれを試してください

echo '1540 "A B"' | cut -d' ' -f2-

- dは区切り文字、 - fはカットするフィールドです。 - f2 - で2番目のフィールドを最後までカットします。

72
TheAshwaniK

これは、コマンド出力「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列目を印刷します

28
hemanto

そのためにawkは必要ありません。 Bashシェルでreadを使用すれば十分です。

some_command | while read c1 c2; do echo $c2; done

または

while read c1 c2; do echo $c2; done < in.txt
15
kenorb

あなたがGNU awkを持っているなら、これはあなたが望む解決策です:

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"
10
Chris Seymour
#!/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

0
Andy Southwell
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file
0
Vijay