パターンマッチングに基づいてあるファイルから別のファイルに行を移動するには?

パターンマッチングに基づいてあるファイルから別のファイルに行を移動するには?

テキストファイルの行を別のテキストファイルに移動したいと思います。この行には、下線で始まる単語が含まれています。この単語は次の場所にあります。六度音程行フィールドはスラッシュで区切られます。たとえば、_Nokia次の例の入力ファイルで、6番目のフィールドを含む行を移動します。

Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/
Apple/One-plus/Samsung/Mi/HTC/OPPO/

正規表現を使用してその行を移動しようとしましたが、grep機能しません。

$ grep -F 'Apple/One-plus/Samsung/Mi/^[a-zA-Z]([\w -]*[a-zA-Z])?$/_Nokia/' match.txt >file1.txt
$ grep -F -v "Apple/One-plus/Samsung/Mi/^[a-zA-Z]([\w -]*[a-zA-Z])?$/_Nokia/" match.txt \
    > match.txt.tmp && mv match.txt.tmp match

期待される出力

$ cat file1.txt
Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/
$ cat match
Apple/One-plus/Samsung/Mi/HTC/OPPO/

パターンマッチングに基づいてあるファイルから別のファイルに行を移動するには?

答え1

オリジナル

-F関連オプションを使用して正規表現を指定することはできませんgrep。正規表現に関する質問もあります。この文字が^行の先頭に一致するようにアンカーとして使用される場合は、正規表現の最初の文字でなければなりません。

prompt% cp -v input input.back
prompt% grep -e "$regex" input.back > output
prompt% grep -v "$regex" input.back > input

正規表現:原作者が具体的な入力を提供しなかったので、適切な正規表現を見つけることは困難でした。

編集する:最後に、元のポスターはサンプル入力ファイルを提供します。

Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/
Apple/One-plus/Samsung/Mi/HTC/OPPO/

正規表現: regex

regex='\([-[:alpha:]]\+\/\)\{5\}_Nokia\/'

代替ソリューション

これらの同様の解決策は、sedマニュアルを読んだことがない初心者にはお勧めできません。

sed -n "/$regex/p;/$regex/d;w input" input.back > output

大まかに言えば、正規表現に一致する行をファイルに保存し、そのoutputsedバッファからそれを削除し、バッファの内容をファイルに書き込みますinput

sed -i.back -e "/$regex/w output" -e "/$regex/d" input

このコマンドには微妙な違いがありますが、2番目のコマンドがより便利です。

答え2

適切な最新バージョンのGNU awk()がある場合は、gawk次のことができます。

awk -i inplace -F'/' '$7 == "_f" {print > "otherfile"; next} 1' file

awkがこのオプションをサポートしていない場合は同じことが-i inplaceできますが、出力を一時ファイルにリダイレクトしてから名前を変更できます。

答え3

この提案はどうですか?これはあまり簡単な提案ではありません@steeldriverの返信それにもかかわらず、これは段階的な解決策です(段階的)。

$ cut -d/ -f7 data.txt  | grep -n _f | cut -d: -f 1 | xargs -i sed -n {}p data.txt > otherfile.txt
  • _f他のファイルと一致するアイテムを作成するときのパターン。

  • data.txtあなたのファイルです。

  • /あなたの区切り記号は何ですか

これがうまくいけば、計算を実行してcomm元のファイルに何を保存する必要があるかを調べてください。

$ comm -23 data.txt otherfile.txt > remainder.txt

残りの.txtはビットが削除されたdata.txtです。

答え4

まず、次の手順を実行して、予測行を別のファイル(outem.txt)に移動できます。

sed -n  '/_/w outemp.txt' input_file

次に、次のようにinput_fileから次の行を削除します。

sed  -i '/_/d' input_file

検査結果:

cat outemp.txt 
Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/

cat input_file
Apple/One-plus/Samsung/Mi/HTC/OPPO/

関連情報