Metin dosyasından 2. sütunu kes


15

Metin dosyamda ayırıcı sadece boşluk belirtmek için bir sınırlayıcı yok, çıktı dosyasına sütun 2'yi nasıl kesebilirim,

39    207  City and County of San Francisc   REJECTED          MAT = 0
78    412  Cases and materials on corporat   REJECTED          MAT = 0
82    431  The preparation of contracts an   REJECTED          MAT = 0

Yani ihtiyacım olan çıktı

207
412
432

Yanıtlar:


13

awkArka arkaya birden fazla alanı tek bir alan olarak ele almak en kolayıdır , bu nedenle

awk '{print $2}' file

baskılar

207
412
431

Ancak açıkçası, bu işi yapacak şekilde tasarlanmamış olsa bile, işi yapacak birçok araç var grep:

grep -Po '^[^ ]+[ ]+\K[^ ]+' file

6

Verilerinizi (ör. Cat column.txt) kesmek için borular kullanın.

cat columns.txt | cut -d" " -f5

Sağladığınız örnek verilerde, tek bir boşluk sınırlayıcı alan 5'e istediğiniz verileri koyar. Bu çıktıyı başka bir dosyaya göndermek için yeniden yönlendirme kullanın.

cat collumns.txt | cut -d" " -f5 > field2.txt

Awk komutunu kullanarak, aşağıdaki gibi bir şey yapabilirdiniz, çünkü bulunduğunuz alanı otomatik olarak tanır, çünkü orada veriler vardır (?) Awk hakkında daha fazla bilgi edinmem gerekir.

awk -F' ' '{print $2}' columns.txt

3
İnkatasyon cat ... |nadiren gereklidir. Çoğu Unix komutu, cutbir veya daha fazla girdi dosyasını bağımsız değişken olarak alır, örn cut -d" " -f5 columns.txt.
Denis Howe

1

@jimmij'in dediği gibi awk '{print $2}' file, en basit cevap budur.

Bazı nedenlerden dolayı, kullanmak istemiyorsanız awkve kullanmakta ısrar cutkullanabileceğiniz sed(tek bir sekme içine iki veya daha fazla boşluk her örneğini dönüştürmek için cutkesim içine boru önce 'ın varsayılan sınırlayıcı):

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431

0

Ayırıcı olarak tek boşlukları kullanmaya devam edebilirsiniz, daha fazla sütununuz olacaktır. Verdiğiniz değeri cut -d' ' -f2'den 5'e veya belki 6'ya yükseltin. İstediğiniz sonuçları elde edene kadar sayıyı artırın .


0
grep -Po '^[^ ]+[ ]+\K[^ ]+' file

Yukarıdaki gibi bir kabuk komut dosyası içinde "kök" kullanıcı olarak değiştirirseniz awk gibi veri çıkarma için Linux yardımcı programları çalışmazsa çok yararlıdır:

sudo -i <<EOF
ps aux | grep -E -i "[l]js"  |grep -v "javaagent" | awk '{print $2}' # So awk won't work here
ps aux | grep -E -i "[l]js"  | grep -v "javaagent" | grep -Po '^[^ ]+[ ]+\K[^ ]+'
EOF

1
Örneğinizde " awkişe yaramaz" olmasının tek nedeni , burada belgenin tırnaksız olması, yani $2kabuk tarafından ikinci konum parametresine genişletilmesidir. Solüsyon bir geçiş için değil muhtemelen grepkomuta ama ya kaçmayı $içinde $2olarak \$2veya sadece kullanarak belgenin tamamını alıntı yapmak <<'EOF'yerine <<EOF. Ayrıca, örneğinizdeki görevin daha basit bir şekilde gerçekleştirildiğine dikkat edin pgrep.
Kusalananda

Çok teşekkürler @Kusalananda. Bir cazibe gibi çalıştı.
Alok Tiwari
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.