
他のすべてのレコードは、保持しながらコメントで始まるレコードを無視するようにawkにどのように指示できますか?次のawkスクリプトは、このサンプルテストファイルのハッシュ記号で始まるレコードを無視しません。録音もスキップしますnumpy
。
# Version numbers have been retrieved from a range of machines and environments.
# Take them with a grain of salt.
# Direct dependencies
#python==3.6.0
#pip==9.0.1
#setuptools==38.2.4 # old for MarkupSafe 1.0 (28.8.0 is installed with py 3.6)
numpy==1.12.1 # 1.12.0
pandas==0.19.2
awkスクリプト
#! /usr/bin/awk -f
BEGIN {
regex=/^[a-zA-Z]+\S+/
n=0
}
$1 ~ regex {print $1; n++};
END{
{print "\n# \n# End proccessing of "FILENAME" \n# Original file had "NR" records\n# Current file record count is "n};
{ if(NR>=n) print "#\n# Mattached all records"};
}
出力(バーを無視)
|| #python==3.6.0
|| #pip==9.0.1
|| pandas==0.19.2
||
|| #
|| # End proccessing of requirements.txt
|| # Original file had 9 records
|| # Current file record count is 3
|| #
|| # Mattached all records
答え1
regex=/^[a-zA-Z]+\S+/
「結果を比較し$0
て/^[a-zA-Z]+\S+/
結果を変数に保存する」regex
という意味で、regex
割り当てられた結果は1または0になり、BEGIN
まだ行を読み取っていないセクションにあるため、$ 0はまだ空なので、次のようになります。regex=0
。
\S
GNU awk 拡張です。つまり、[^[:space:]]
GNU awkを使用している場合は、強力な形式の正規表現定数もサポートしています(参照:https://www.gnu.org/software/gawk/manual/gawk.html#Strong-Regexp-Constants)。これを念頭に置いて、次のことができます(記号を参照@
)。
$ seq 5 | awk 'BEGIN{re=@/3/} $0 ~ re'
3
しかし、GNU awkでのみ可能です。
別のawkバリアント(このバージョンを使用していると仮定すると、20070501
BSDバリアントを使用していると思われます)の最良の方法は、動的正規表現を使用することです。
$ seq 5 | awk 'BEGIN{re="3"} $0 ~ re'
3
答え2
これはawkモードではありません(Perlに似ています)。
regex=/^[a-zA-Z]+\S+/
次のように動作します。
regex="^[a-zA-Z]+[^[:space:]]+"
また、パターンが一致する必要があります$0
(ではありません$1
)。 $0
フルラインです。 $1
最初のフィールドです(最初のフィールドと見なされます)。言葉一行で:おそらくなし#
最初の列の内容と一致します)。
これら2つの修正により、あなたの例は私にとって効果的です...