2016-03-19 19 views
0

belirli sütunları ve spesifik bir çizgi çek:Bir <code>.dat</code> dosyası var bir boru ayrılmış dosya

#id|firstName|lastName|gender|birthday|creationDate|locationIP|browserUsed 
933|Mahinda|Perera|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox 
1129|Carmen|Lepland|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer 
4194|Hồ Chí|Do|male|1988-10-14|2010-03-17T22:46:17.657+0000|103.10.89.118|Internet Explorer 
8333|Chen|Wang|female|1980-02-02|2010-03-15T10:21:43.365+0000|1.4.16.148|Internet Explorer 
8698|Chen|Liu|female|1982-05-29|2010-02-21T08:44:41.479+0000|14.103.81.196|Firefox 
8853|Albin|Monteno|male|1986-04-09|2010-03-19T21:52:36.860+0000|178.209.14.40|Internet Explorer 
10027|Ning|Chen|female|1982-12-08|2010-02-22T17:59:59.221+0000|1.2.9.86|Firefox 

Ben id belirli bir hattan firstName, lastName ve birthday götürmek istiyorum.

Örnek: giriş 933 ise, I (boşluk ile ayrılmış) çıkarmak isteyen:

Mahinda Perera 1989-12-03 
+0

Bu muhtemelen daha iyi ** awk ** kullanılarak yapılır. –

cevap

1

Bu bunu yapmak gerekir:

#!/bin/sh 
id="$1" 
awk -F '|' -v ID="$id" '($1==ID){print $2, $3, $5}' infile 

Aşağıdaki gibi kullan:

$ script.sh 933 
Mahinda Perera 1989-12-03 
0 GNU'da ile
+0

Cevabınız için teşekkür ederim, ana komutumdan komut istemiyle çalıştırmak istiyorum ./script.sh id dosya.dat -id 933 Bunu nasıl çalıştırabilirim ve çalışabilirim? – user3583029

+0

Bunu buldum, çok teşekkür ederim ve ikinci aptal soru için üzgünüm: D – user3583029

-1

Kullanım:

awk '{print $2 $3 $5}' infile.dat 
+0

Alan ayırıcısını varsayılan değerden değiştirmeli ve kimliğine göre filtrelemelisiniz - ve sonra BinaryZebra'nın cevabına sahipsiniz. –

0

sed:

$ id=933 
$ sed -n "/^$id"'|/{s/^[^|]*|\([^|]*\)|\([^|]*\)|[^|]*|\([^|]*\)|.*$/\1 \2 \3/p;q}' infile 
Mahinda Perera 1989-12-03 

-n baskı engeller; gerisi yapar:

"/^$id"'|/ { # If a line starts with the ID... (notice quoting for parameter expansion) 
    # Capture second, third and fifth field, discard rest, print 
    s/^[^|]*|\([^|]*\)|\([^|]*\)|[^|]*|\([^|]*\)|.*$/\1 \2 \3/p 
    q   # Quit to avoid processing the rest of the file for nothing 
}' 

BSD sed altında bu çalışmasına almak için q ve Kapanış ayracı arasına başka noktalı virgül olmalı.

Bu awk'nin problem için daha uygun olduğunu göstermeye çalışır.

+0

Yakalama/silme ikamesini aşağıdaki gibi bir şeye göre değiştirebilirsiniz: 's/\ ([^ |] * \) // 4g' – andlrc

+0

@ dev-null Oldukça anlayamıyorum, bu, son yakalama grubundan sonraki satırın geri kalanını atmaktan nasıl daha iyi? –

+0

Bunun daha iyi olduğunu belirtmem, sadece bunun işe yarayabileceğini belirtmem. Ama ben daha kısa regex – andlrc

1
awk -F'|' '$1 ~ /933/{print $2, $3, $5}' file 
Mahinda Perera 1989-12-03 

alan bir 933 baskı aşağıdaki alanları eşleşirse: 2,3 ve 5.

İlgili konular