4つの列を持つタブ区切りファイルがあります。 appleという列1で特定のパターンを持つ行を見つけるためにgrepを実行したいと思います。中サイズ~の窒素。最初の数字が2番目の数字と一致するか、1番目の数字が2番目の数字より1小さい行だけを抽出したいと思います。次の例では、2、3、5行(ヘッダー行を除く)がパターンと一致しています。
Col1 col2 col3 col4
apple (XY_012345, apple 6 of 10) 1 12228 12612
apple (XY_678901, apple 5 of 6) 1 12722 13220
apple (XY_234567, apple 2 of 2) 1 18437 24737
apple (XY_890123, apple 8 of 30) 1 24892 29269
apple (XY_456789, apple 12 of 12) 1 35175 35276
答え1
GNU awkでも同様のことがあります:
$ gawk 'match($0, /([0-9]+) of ([0-9]+)/, a) && (a[2] == a[1] || a[2] == a[1]+1)' file
apple (XY_678901, apple 5 of 6) 1 12722 13220
apple (XY_234567, apple 2 of 2) 1 18437 24737
apple (XY_456789, apple 12 of 12) 1 35175 35276
答え2
perl -ne 'print if /(\d+) of (\d+)/ && ($1 == $2 or $1 == ($2 - 1))' < input
これは、提供された入力を繰り返し、次の場合にのみ行を印刷する「1行」Perlスクリプトです。
of
「」という文字で区切られた2つの数字をマッチングしてキャプチャした後、- 最初の数字は2番目の数字と同じか1つです。