テキストファイルの行を別のテキストファイルに移動したいと思います。この行には、下線で始まる単語が含まれています。この単語は次の場所にあります。六度音程行フィールドはスラッシュで区切られます。たとえば、_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
大まかに言えば、正規表現に一致する行をファイルに保存し、そのoutput
sedバッファからそれを削除し、バッファの内容をファイルに書き込みます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/