私はさまざまな人が手動で作成したこれらのファイルを持っています。形式は特定の規則に従いますが、一様ではありません。
次の3行を考えてみましょう。
"erroneous_data_F08R16_recordeded_by_tech21"
"erroneous_data_F8R16_recordeded_by_tech021"
"erroneous_data_F008R016_recordeded_by_tech21"
すべて同じことを指します。 F008またはF08またはF8はファイル番号8を意味します。 R16またはR016または(可能であればR[単位数])は、行番号16を意味します。
指定されたファイルにこれらの行がある場合は、while read line
ループを使用してスキャンします。
私が望むのは、上記の3行の例のF008R016のように、ファイルと行番号の部分を均一にすることです。なぜなら、私のファイル番号は3桁を超えず(999に達した後にローリングされ、行番号は決してそうではありません)、複数があるからです。しかし、一貫性のために3桁の数字だとしましょう。処理する必要があるこのファイルには構造化されていないコメントもあるため、最初の作業は行を検出して複数行に分割することです。別の一時ファイルを作成して統合します。
これを達成するために、私の計画はパターンと一致する正規表現の行とgrepをエコーすることです。残念ながら、正規表現は私には適していません。
これまで行の file#row# 構造を検出するのに閉じ込められていました。
cat InputFile | while read line
do
echo $line | grep '[F,f]\d\d[R,r]\d\d' >/dev/null #this is assuming two digit file number and 2 digit row number
result=$?
if [ $result -eq 0 ]
then
echo $line >tempfile
fi
done
行にF08R16パターンが含まれていても、grepコマンドのこの正規表現の一致は常に失敗します。
これが完了したら、この部分文字列を変数として抽出し、変数の構造を分析し、必要に応じてゼロを追加して均一にします。
私の正規表現を修正し、変数抽出というより高い目標を達成するための提案があれば大いに感謝します。
とにかく私はCentOSバージョン6.7を開発していましたが、利用可能な他のディストリビューションがありました。
ベストアンサー1
f
aが出るまで、またはan、F
次に1、2、または3つの数字、次にor r
、R
次に1、2、または3つの数字を再一致させたいとします_
。その場合は、次のことができます(GNUを使用grep
)。
grep -iP 'f\d{1,3}r\d{1,3}_' InputFile > tmpfile
またはGNUでない場合grep
:
grep -iE 'f[0-9]{1,3}r[0-9]{1,3}_' InputFile > tmpfile
しかし、これはほぼ確実です。XYの問題。実際、シェルではこの種の作業をしたくありません。たとえば、次のperl
行はすべての関連行の形式を正しく指定します。
$ perl -pe 's/_f(\d+)r(\d+)_/sprintf("_F%03dR%03d_",$1,$2)/ei' file
"erroneous_data_F008R016_recordeded_by_tech21"
"erroneous_data_F008R016_recordeded_by_tech021"
"erroneous_data_F008R016_recordeded_by_tech21"
これは、そのような問題を回避するためにどのトリックを使用できるかについてのアイデアを提供するためのものです。