3

我有一个 Query.txt 文件,其中包含如下数据:

  # Query: Name_ID
  # 2 hits found****
    # Query: Name_ID
    # 20 hits found
    # Query: Name_ID
    # 0 hits found

当我 awk 或 grep 获取模式时,我得到如下输出:

grep "0 hits found" Query.txt | head
 # 20 hits found
 # 0 hits found
 # 140 hits found
 # 70 hits found

两个问题:我如何专门获得“找到的 0 个命中”而不是 20、140 或 70?第二,如何使用 AWK 创建另一个格式如下的文件 Query2.txt ?

# Query: Name_ID  # 2 hits found
# Query: Name_ID  # 20 hits found
# Query: Name_ID  # 0 hits found
4

4 回答 4

5

要仅获取0 hits found尝试匹配该字符串但在零之前没有数字的行:

awk '$0 ~ /[^[:digit:]]0 hits found/' infile

假设一个测试输入文件 ( infile) 像:

# Query: Name_ID1
# 2 hits found
# Query: Name_ID2
# 20 hits found
# Query: Name_ID3
# 0 hits found
# Query: Name_ID4
# 140 hits found
# Query: Name_ID5
# 0 hits found
# Query: Name_ID6
# 60 hits found

它产生:

# 0 hits found
# 0 hits found

对于第二个问题,用于getline读取奇数行并同时打印两者,例如:

awk '{ getline hits_line; printf "%s %s\n", $0, hits_line }' infile

使用与以前相同的测试文件,它产生:

# Query: Name_ID1 # 2 hits found
# Query: Name_ID2 # 20 hits found
# Query: Name_ID3 # 0 hits found
# Query: Name_ID4 # 140 hits found
# Query: Name_ID5 # 0 hits found
# Query: Name_ID6 # 60 hits found

尝试这种任务,所以这里有一个解决方案:

内容script.vim

set backup
for n in range( 1, line('$') / 2 )
        execute "normal Jj"
endfor
saveas! Query2.txt
q!

像这样运行它:

vim -S script.vim infile

这将生成一个Query2.txt包含内容的文件:

# Query: Name_ID1 # 2 hits found
# Query: Name_ID2 # 20 hits found
# Query: Name_ID3 # 0 hits found
# Query: Name_ID4 # 140 hits found
# Query: Name_ID5 # 0 hits found
# Query: Name_ID6 # 60 hits found
于 2013-06-07T18:54:23.047 回答
1

GNU sed

sed '/\s0/!d' file

(为什么“找到命中”?)

awk '/\y0/' file
于 2013-06-07T19:30:16.980 回答
0

一种方法sed

sed -n 'N;/\<0 hits/{s/\n/ /;P}' Query.txt

测试:

[jaypal:~/Temp] cat Query.txt
# Query: Name_ID
# 2 hits found****
# Query: Name_ID
# 20 hits found
# Query: Name_ID
# 0 hits found

[jaypal:~/Temp] sed -n 'N;/\<0 hits/{s/\n/ /;P}' Query.txt
# Query: Name_ID # 0 hits found
于 2013-06-08T07:11:40.557 回答
0

您只需要在 0 之前添加一个单词边界:

grep '\<0 hits found' Query.txt

您可以通过以下方式实现第二部分

paste - - < Query.txt

基本上,这会连接文件中的每 2 行。

于 2013-06-07T19:11:42.263 回答