リストの文字列が行の最初の12文字以内で見つかった場合は、大容量ファイルから行を削除しますか?

リストの文字列が行の最初の12文字以内で見つかった場合は、大容量ファイルから行を削除しますか?

以下のように、+184000行* +5400行を含むファイル行列があります。

denovo1 someverylaaargenumbers and lotandlotsoftextuntil 5400.........
denovo10 someverylaaargenumbers and lotandlotsoftextuntil 5400........
denovo100 someverylaaargenumbers and lotandlotsoftextuntil 5400.......
denovo1000 someverylaaargenumbers and lotandlotsoftextuntil 5400......
denovo10000 someverylaaargenumbers and lotandlotsoftextuntil 5400.....
denovo100000 someverylaaargenumbers and lotandlotsoftextuntil 5400......
denovo184117 someverylaaargenumbers and lotandlotsoftextuntil 5400......

2番目のファイルには、次の識別子のリストがあります。

denovo1
denovo100
denovo1000
denovo100000

識別子がファイル2で見つかった場合は、行列1の行を消去したいと思います。したがって:

denovo10 someverylaaargenumbers and lotandlotsoftextuntil 5400........
denovo10000 someverylaaargenumbers and lotandlotsoftextuntil 5400.....
denovo184117 someverylaaargenumbers and lotandlotsoftextuntil 5400......

1行ずつ読み、ファイル2の文字列を見つけるための短いUnixコードがあります。

while read -r line
do
echo $line
sed -i '' '/$line/d' /my/path/matrix1
done < /my/path/file2

動作はされますが、すべての行を最後まで読んでくれるので時間がかかります。マシンに各行の最初の12文字だけを読み取る方法はありますか?

ベストアンサー1

そしてgrep

grep -vwf file matrix > matrix.new
mv matrix.new matrix
  • パターン入力ファイル-f FILEとして使用するオプションFILE
  • -w単語全体を構成する一致を含む行のみを選択するオプション
  • -v一致しない行を選択するオプション

空行はfile許可されません。

あるいは、識別子ファイルを手動で生成する場合は、アンカーを使用して行の^先頭を一致させ、各識別子の後にスペース文字を追加してパターンの終わりを表示します。

printf '^%s \n' denovo{1,100,1000,100000} > file
grep -vf file matrix > matrix.new
mv matrix.new matrix

おすすめ記事