Take specific columns and specific line from a pip

2019-09-09 17:03发布

I've got a .dat file:

#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

I want to take firstName, lastName and birthday from a specific line by id.

Example: if the input is 933, I want to extract (separated by space):

Mahinda Perera 1989-12-03

4条回答
看我几分像从前
2楼-- · 2019-09-09 17:38

With GNU sed:

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

-n prevents printing; the rest does this:

"/^$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
}'

To get this to run under BSD sed, there has to be another semicolon between the q and the closing brace.

Goes to show that awk is much better suited for the problem.

查看更多
老娘就宠你
3楼-- · 2019-09-09 17:39

This should do it:

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

Use as:

$ script.sh 933
Mahinda Perera 1989-12-03
查看更多
Explosion°爆炸
4楼-- · 2019-09-09 17:55

Use:

awk '{print $2 $3 $5}' infile.dat
查看更多
爷的心禁止访问
5楼-- · 2019-09-09 17:57
awk -F'|' '$1 ~ /933/{print $2, $3, $5}' file 
Mahinda Perera 1989-12-03

If field one matches 933 print following fields: 2,3 and 5.

查看更多
登录 后发表回答