İkinci sütun komut çıktısından nasıl alınır?


155

Komutumun çıktısı şöyle bir şey:

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

İlk sütun her zaman bir sayıdır, ardından bir boşluk ve ardından çift tırnaklı bir dizedir.

Amacım sadece ikinci sütunu elde etmektir, örneğin:

"A B"
"C"
"D"

Bunu <some_command> | awk '{print $2}'başarmak için kullanmayı düşündüm . Ancak soru şu ki, ikinci sütundaki bazı değerler awk, alanları ayırmak için varsayılan sınırlayıcı olan boşluk (lar) içerir . Bu nedenle, çıktı karışık:

"A
"C"
"D"

İkinci sütunun değerini (çift tırnak işaretleriyle) temiz bir şekilde nasıl elde ederim?



1
Kullanmayı denedim awk '{$1=""; print $0}', ancak hala önde gelen bir beyaz boşluk karakteri var. Tarafından kaldırılabilir sed '/^ //'. Yine de, bu yapılabilir awkmi?
Qiang Xu

Yanıtlar:


29

Veya sed ve regex'i kullanın.

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

Başlangıç ​​ve bitiş işaretlerine ihtiyaç duymadığınız için daha kısa cmd:<some_command> | sed 's/.* \(".*"\)/\1/'
Timo

202

-F [field separator]Satırları bölmek için kullanın ":

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

veya borudan giriş için

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

çıktı:

A B
C
D

3
Bu iyi, ama aynı zamanda orijinal alıntıları da istiyorum. Yapılabilir mi? Teşekkürler.
Qiang Xu

5
hile yapabilir ve awk'ın baskısını şu şekilde değiştirebilirsiniz'{print "\""$2"\""}'
Alex

Evet, bu işe yarıyor. Çok teşekkürler Alex! Bu arada, çok fazla alıntı, :)
Qiang Xu

@Alex, operasyonun istediğini elde etmek için çift tırnak işaretlerini ve ters eğik çizgiyi nasıl kullandığınızı açıklayabilir misiniz?
Timo

1
@Timo Tırnak işaretleri ve ters eğik çizgi dökümü olarak tasavvur edilebilir "\"" + $2 + "\"". Çevreleyen tırnak işaretleri, çıktıya eklenecek bir şeyi belirtiyor ve çıkmış tırnak işareti ( \") yazdırılıyor. Yardım görselleştirmek için, bu biz boş alanlar etrafında eklemek istiyorsa nasılolabileceği olduğu $2yerine tırnak işareti: '{print " "$2" "}'. Düzenlemeyi biraz daha kolaylaştırmak için format aralığı da ekleyebiliriz:'{print " " $2 " "}'
Tom

81

"Awk" dışında bir şey kullanabiliyorsanız, bunun yerine bunu deneyin

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

-d bir sınırlayıcıdır, -f kesilecek alandır ve -f2- ile 2. alanı sonuna kadar kesmek istiyoruz.


bu, aşağıdakileri yapmaya çalışırken bana yardımcı oldu (git'teki bir dosyanın commit kimliğini getir): git annotate myfile.cpp | grep '2016-07' | kafa -1 | cut -f1
serup

2
Bu iyidir, ancak sınırlayıcı birden fazla karakter uzunluğundaysa çalışmaz. Awk çözümünün
işe yaradığı yer burasıdır

2
Neden sonra boşluk kullanılmıyor -d? Bu şekilde biraz tuhaf görünüyor.
Chris Stryczynski

46

Bu, "docker images" komut çıktısından belirli bir sütunu almak için çalışmalıdır:

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

Bu, üçüncü sütunu yazdıracak


Docker imajlarının bittiğini gördünüz mü | awk '{baskı $ 5}'?
Shashi Ranjan

17

Bunun için awk'a ihtiyacın yok. readBash kabuğunda kullanmak yeterli olmalıdır, örn.

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

veya:

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

13

GNU awk'ye sahipseniz, istediğiniz çözüm budur:

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"

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

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

Ardından, komut dosyasını co olarak adlandırdığınızı varsayalım, örneğin, dosyaların boyutlarını almak için şöyle bir şey yapın (örnek, Linux kullandığınızı varsayar, ancak komut dosyasının kendisi işletim sisteminden bağımsızdır): -

ls -lh | co 5

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.