Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从第一列中提取子字符串_Linux_Bash_Unix_Awk_Sed - Fatal编程技术网

Linux 从第一列中提取子字符串

Linux 从第一列中提取子字符串,linux,bash,unix,awk,sed,Linux,Bash,Unix,Awk,Sed,我有一个有两列的大文本文件。第一列较大且复杂,但包含name=“…”部分。第二列只是一个数字 如何生成文本文件,使第一列仅包含名称,而第二列保持不变并显示数字?基本上,我只想从第一列中提取一个子字符串,第二列保持不变 样本数据: application{id="1821", name="app-name_01"} 0 application{id="1822", name="myapp-02", optionalFlag="false"} 1 application{id="1823", opt

我有一个有两列的大文本文件。第一列较大且复杂,但包含
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
...

使用GNU
awk

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

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
...

使用GNU
awk

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

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
...

如果您的实际输入文件与所示示例相同,则以下代码可能会在相同方面帮助您

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

app-name_01 0
myapp-02 1
app_name_public 3

如果您的实际输入文件与所示示例相同,则以下代码可能会在相同方面帮助您

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

app-name_01 0
myapp-02 1
app_name_public 3

下面是一个
sed
解决方案:

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

有了Paranthesis,您的店铺就可以分组了,中间有什么内容。
第一组是
name=“
之后的所有内容,直到第一组
<代码>[^”]表示“不是双引号”。

第二组是简单的“一个或多个在行尾加空格的数字”。

这里有一个
sed
解决方案:

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

有了Paranthesis,您的店铺就可以分组了,中间有什么内容。
第一组是
name=“
之后的所有内容,直到第一组
[^”]
表示“不是双引号”。

第二组是简单的“一个或多个数字在行尾,前面有一个空格”

行是否相似,或者名称是否可以位于该列的任何位置?显示一些示例数据。名称可以位于该列的任何位置,因此我需要使用正则表达式(如
name=“([a-zA-Z0-9_-])”
)对其进行匹配,parens表示在组中捕获此部分。您已经显示了结果,但请显示示例输入。行是否相似,或者名称是否可以位于该列的任何位置?显示一些示例数据。名称可以位于该列中的任何位置,因此我需要使用正则表达式匹配它,例如
name=“([a-zA-Z0-9_-])”
,parens表示在组中捕获此部分。您已经显示了结果,但请显示示例输入。恐怕这对我的真实数据不起作用,这更复杂。样本数据非常基本,但提供与实际结构完全匹配的样本数据几乎是不可能的。谢谢,对不起!我担心这对我的真实数据不起作用,这更复杂。样本数据非常基本,但提供与实际结构完全匹配的样本数据几乎是不可能的。谢谢,对不起!