Bagaimana cara mendapatkan kolom kedua dari output perintah?

152

Output perintah saya adalah seperti:

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

Kolom pertama selalu berupa angka, diikuti oleh spasi, lalu string yang dikutip ganda.

Tujuan saya adalah untuk mendapatkan kolom kedua saja, seperti:

"A B"
"C"
"D"

Saya bermaksud menggunakan <some_command> | awk '{print $2}'untuk mencapai ini. Tetapi pertanyaannya adalah, beberapa nilai di kolom kedua berisi spasi, yang merupakan pembatas default untuk awkmemisahkan bidang. Oleh karena itu, hasilnya kacau:

"A
"C"
"D"

Bagaimana cara mendapatkan nilai kolom kedua (dengan kutipan berpasangan) dengan bersih?

Qiang Xu
sumber
1
Saya mencoba menggunakan awk '{$1=""; print $0}', tetapi masih memiliki karakter spasi putih terkemuka. Itu bisa dihapus oleh sed '/^ //'. Namun, dapatkah ini dilakukan awk?
Qiang Xu

Jawaban:

29

Atau gunakan sed & regex.

<some_command> | sed 's/^.* \(".*"$\)/\1/'
Catay
sumber
Cmd lebih pendek karena Anda tidak perlu penanda awal dan akhir:<some_command> | sed 's/.* \(".*"\)/\1/'
Timo
197

Gunakan -F [field separator]untuk membagi garis pada "s:

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

atau untuk input dari pipa

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

keluaran:

A B
C
D
Alex
sumber
3
Ini bagus, tapi saya juga ingin kutipan asli di sekitarnya. Bisakah itu dilakukan? Terima kasih.
Qiang Xu
5
Anda bisa menyontek, dan mengubah pencetakan awk ke'{print "\""$2"\""}'
Alex
Yup, ini berhasil. Terima kasih banyak, Alex! Omong-omong, begitu banyak kutipan, :)
Qiang Xu
@Alex, dapatkah Anda menjelaskan bagaimana Anda menggunakan tanda kutip ganda dan garis miring terbalik untuk mendapatkan apa yang diinginkan op.
Timo
1
@Timo Rincian harga dan garis miring terbalik dapat dibayangkan sebagai "\"" + $2 + "\"". Tanda kutip di sekitarnya menunjukkan sesuatu yang akan ditambahkan ke output, dan tanda kutip yang lolos ( \") sedang dicetak. Untuk membantu memvisualisasikan itu, ini adalah apa yang akan terlihat seperti jika kita ingin menambahkan ruang kosong di sekitar $2bukan tanda kutip: '{print " "$2" "}'. Kita juga dapat menambahkan spasi format untuk membuatnya lebih mudah grok:'{print " " $2 " "}'
Tom
80

Jika Anda bisa menggunakan sesuatu selain 'awk', cobalah ini sebagai gantinya

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

-d adalah pembatas, -f adalah bidang untuk memotong dan dengan -f2- kami bermaksud untuk memotong bidang ke-2 sampai akhir.

TheAshwaniK
sumber
ini membantu saya mencoba melakukan hal berikut (mengambil id komit dari file di git): git annotate myfile.cpp | grep '2016-07' | kepala -1 | cut -f1
serup
2
Ini bagus, tetapi tidak berfungsi jika pembatas lebih dari satu karakter. Di situlah solusi awk berguna
smac89
2
Mengapa ruang tidak digunakan setelahnya -d? Terlihat agak aneh dengan cara itu.
Chris Stryczynski
43

Ini harus bekerja untuk mendapatkan kolom tertentu dari output perintah "gambar buruh pelabuhan":

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

Ini akan mencetak kolom ketiga

hemanto
sumber
Pernahkah Anda melihat gambar docker | awk '{print $ 5}'?
Shashi Ranjan
17

Anda tidak perlu awk untuk itu. Penggunaan readdi Bash shell harus cukup, misalnya

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

atau:

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

Jika Anda memiliki GNU awk, ini adalah solusi yang Anda inginkan:

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"
Chris Seymour
sumber
0
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file
Vijay
sumber
0
#!/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

Kemudian, seandainya Anda menamai skrip sebagai co, katakan, lakukan sesuatu seperti ini untuk mendapatkan ukuran file (contohnya Anda menganggap Anda menggunakan Linux, tetapi skrip itu sendiri adalah OS-independen): -

ls -lh | co 5

Andy Southwell
sumber