柔軟なパターンマッチング

柔軟なパターンマッチング

次のファイルがあります。

ファイル1:

0/28
7200/11
14400/11
21584/28
21600/11
28800/28
36000/11
36000/28
43200/11
43200/28
50400/11
57600/11
79200/28

左部分(/前)には秒単位の時間があり、右部分には秒単位のパラメータ値があります。

今、次のような別のファイルがあります。

ファイル2:

0 14
0 15
0 20
0 28
7200 11
7200 14
7200 15

2番目のファイルからFILE1の共通値を削除したいと思います。たとえば、FILE2から削除する必要があります。

0 28
7200 11

残りの行は変更せずに残します。

FILE1の各行に対してbashスクリプトでforループを使用してから、FILE2でその行を検索したいがパターンを認識できません。 awkでsubstrを使用しようとすると、時間の数が等しくないため動作しません(0は1桁、7200は4桁)。

FILE1を読み取るには、次の操作を行います。

IFS=$'\n' read -d '' -r -a X < ./FILE1.csv

for ループを作成するには、次のようにします。

for x in "${X[@]}"
do
    gawk -i inplace -v var=${x} '{...}' FILE2.csv
done

また、FILE1を次に変換することを検討しています。

0 28
7200 11
14400 11
21584 28
21600 11
28800 28
36000 11
36000 28
43200 11
43200 28
50400 11
57600 11
79200 28

デフォルトでは2つの列がありますが、上記で使用したforとvarを使用して2つ以上の列がある場合は機能しません。 2番目のアプローチはより良いと思いますが、各列を個別に処理する方法がわかりません。

編集する:

FILE1が次の場合:

0 28
7200 11
14400 11
21584 28
21600 11
28800 28
36000 11
36000 28
43200 11
43200 28
50400 11
57600 11
79200 28

FILE2は次のようになります。

0 14 2 19
0 15 157 67
0 20 28 57
0 28 25 67
7200 11 88 14
7200 14 34 247
7200 15 364 14

ベストアンサー1

使用awk:

awk 'NR==FNR { sec[$1, $2]; next } !($1, $2) in sec' FS='/' file1 FS=' ' file2
0 14
0 15
0 20
7200 14
7200 15

これFS(F生産するSeerator) は、対応するファイルの前の各入力ファイルのフィールド区切り文字を定義します。

おすすめ記事