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

2 つの質問: 20、140、または 70 ではなく、"0 件のヒットが見つかりました" だけを具体的に取得するにはどうすればよいですか? 次に、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

2 番目の質問では、次のよう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 に答える
0

それを行う1つの方法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 に答える