作为更大代码的一部分,我必须从下面的行中获取特定字段。
user 25999 0.0 0.7 678772 259772 ? Ssl Nov05 11:54 fwd
我有一个包含类似行的数据文件。我以前需要这个价值吗?从所有线路返回。我被卡住了。试过awk -F '?' '{print $1}' | awk '{print $NF}' test1.txt
,吐出垃圾。不确定我错过了什么。
答案 0 :(得分:1)
将此作为测试文件:
$ cat file
user 25999 0.0 0.7 678772 259772 ? Ssl Nov05 11:54 fwd
要获取?
之前的值,请尝试:
$ awk '{sub(/?.*/, ""); print $NF}' file
259772
命令sub(/?.*/, "")
消除了从?
到行尾的所有文本。完成此操作后,新修订的行$NF
上的最后一个字段就是您想要的字段。
这不起作用:
$ awk -F '?' '{print $1}' | awk '{print $NF}' file
fwd
上面发生的是awk '{print $NF}' file
从file
读取并打印出该行的最后一个字段。来自awk -F '?' '{print $1}'
的标准输入被忽略。
通过在第一个命令中放置文件名,我们可以实现您想要的目标:
$ awk -F '?' '{print $1}' file | awk '{print $NF}'
259772
我们来看看这个测试文件:
$ cat file
user1 25999 0.0 0.7 678772 259772 ? Ssl Nov05 11:54 fwd
user2 25999 0.0 0.7 678772 1500000 ? Ssl Nov05 11:54 fwd
user3 25999 0.0 0.7 678772 259772 ? Ssl Nov05 11:54 fwd
根据您的意见,仅在?
之前打印数字,只要它是> = 1500000并打印上一行中的第一个字段:
$ awk '{sub(/?.*/, "")} $NF>=1500000{print last,$NF} {last=$1}' file
user1 1500000
答案 1 :(得分:0)
如果您有支持Perl Regex的gnu grep,您可以使用以下内容:
$ grep -Po '.* \K\w+ (?=[?])' file
测试:
$ echo "$a"
user 25999 0.0 0.7 678772 259772 ? Ssl Nov05 11:54 fwd
$ echo "$a" |grep -Po '.* \K\w+ (?=[?])'
259772
Perl Regex中的 \K
表示“忘记以前的比赛”
Perl Regex中的?=
是一个先行断言
[?]
是文字吗?
答案 2 :(得分:0)
我能够使用它 awk' {for(i = 1; i< = NF; i ++)if($ i =="?"&& $(i-1)> = 1500000)print $(I-1)}' FILENAME.TXT 它会在'?'之前打印我文件中的所有行。 > 1500000.我还需要上一行的第一个字以及这个数字。这段代码无法正常工作,因为它一次遍历每行一行。 有什么想法吗?