次のファイルがあります。
ファイル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) は、対応するファイルの前の各入力ファイルのフィールド区切り文字を定義します。