从第一列中提取子字符串

时间:2017-10-11 13:15:14

标签: linux bash unix awk sed

我有一个包含2列的大文本文件。第一列很大且很复杂,但包含name="..."部分。第二列只是一个数字。

如何生成一个文本文件,使第一列只包含名称,但第二列保持不变并显示数字?基本上,我只想从第一列中提取子字符串并使第二列保持不变。

示例数据:

application{id="1821", name="app-name_01"} 0
application{id="1822", name="myapp-02", optionalFlag="false"} 1
application{id="1823", optionalFlag="false", name="app_name_public"} 3
...

所以结果文件就是这样的

app-name_01     0
myapp-02        1
app_name_public 3
...

3 个答案:

答案 0 :(得分:3)

如果您的实际Input_file与显示的示例相同,则以下代码可能会对您有所帮助。

awk '{sub(/.*name=\"/,"");sub(/\".* /," ")} 1'  Input_file

输出如下。

app-name_01 0
myapp-02 1
app_name_public 3

答案 1 :(得分:0)

使用GNU awk

$ awk 'match($0,/name="([^"]*)"/,a){print a[1],$NF}' infile
app-name_01 0
myapp-02 1
app_name_public 3

非Gawk的

awk 'match($0,/name="([^"]*)"/){t=substr($0,RSTART,RLENGTH);gsub(/name=|"/,"",t);print t,$NF}' infile
app-name_01 0
myapp-02 1
app_name_public 3

输入:

$ cat infile
application{id="1821", name="app-name_01"} 0
application{id="1822", name="myapp-02", optionalFlag="false"} 1
application{id="1823", optionalFlag="false", name="app_name_public"} 3
...

答案 2 :(得分:0)

这是一个sed解决方案:

sed -r 's/.*name="([^"]+).* ([0-9]+)$/\1 \2/g' Input_file

说明:

随着parantheses你的商店分组中间的内容。
第一组是name="之后的所有内容,直到第一个"[^"]表示“不是双引号” 第二组只是“在空格之前的行末尾有一个或多个数字”。