ファイル内のすべての行の5番目の単語を削除するにはどうすればよいですか?


13

ファイルの各行の5番目の単語を削除したい。

ファイルの現在のコンテンツ:

File is not updated or and will be removed  
System will shut down f within 10 seconds  
Please save your work 55 or copy to other location  
Kindly cooperate with us D  

期待される出力:

File is not updated and will be removed  
System will shut down within 10 seconds  
Please save your work or copy to other location  
Kindly cooperate with us

回答:


31

どうですかcut

$ cut -d' ' -f1-4,6- file.txt 
File is not updated and will be removed  
System will shut down within 10 seconds  
Please save your work or copy to other location  
Kindly cooperate with us
  • -d' ' 区切り文字をスペースとして設定します

  • -f1-4,6- 1番目から4番目のフィールド(単語)を選択し、5番目のフィールドを残してから、6番目から残りまで印刷を続けます。


11

解決策cut

cut -d ' ' -f1-4 -f6- FILE

-fcut(GNU)では少なくとも複数はサポートされていません
。– heemayl

BSDカットでサポートされていますが、私よりもあなたの反応が好きです。
fd0の

1
GNUカットの場合、--complement物事を簡素化するためのフラグを取得しますcut --complement -d ' ' -f5。出力を新しいファイルにリダイレクトしてからmv、元のファイルに上書きすることを忘れないでください。
トビーSpeight

6

awk:5番目のフィールドを削除

awk '{for (i=5; i<NF; i++) $i = $(i+1); NF--};1' file

ファイルをインプレースで保存する場合:https : //stackoverflow.com/q/16529716/7552

5番目のフィールドの内容を消去することもできますが、2つの連続した出力フィールドセパレータが残ります。

awk '{$5 = ""};1' file

ここでの注意点は、awk内のフィールドの値を変更すると、各フィールド間に1つのセパレータのみを使用して「$ 0」全体を書き換えるという副作用があることです。アライメントを維持したい場合は考慮に入れる必要があります(gnu awkにこれを回避するオプションがない限り、通常のawk / nawkは$ 0を再計算します)
オリビエデュラック

どちらの場合も、単一のセパレータで行を再フォーマットします。区切り文字に2つのスペースまたはスペース+タブがある場合、結果は1つのスペースになります。これは、ほとんどのテキストでうまくいけばうまくいきます。
-NeronLeVelu

4

POSIX sedの場合:

sed -e 's/[^[:alnum:]_][[:alnum:]_][[:alnum:]_]*//4' <file

alnum:なぜにクラスを制限し_ ない何かその後、:blank:または:space:
-NeronLeVelu

@NeronLeVelu:それは言葉を作るものをどのように定義するかにかかっています。
-cuonglm

@mikeserv; ナイスキャッチ!回答を更新しました。
cuonglm

\(キャプチャグループ\)のために?
mikeserv

@mikeserv:入力ミス、デリミタを保持する方法をいくつか試しました。
クオンルム

2

glennは次と同等のソリューションを提供しました

awk '{$ 5 = ""; print} ' ファイル

彼と他の人が指摘したように、これは

  1. すべての行から先頭と末尾の空白を削除します。
  2. 空白の各文字列(スペースおよび/またはタブ)を単一のスペースに圧縮します。
  3. 4番目と6つの単語の間に2つのスペースを残します。

3番目の問題を修正するハックは

awk '{$ 5 = ""; print} ' ファイル | sed 's / / /'

これにより、5つ以下の単語が入っている行の最後に1つ以上の追加スペースが残ります。入力に表示されない単語を特定できる場合、

awk '{$ 5 = "ユニコーン"; print} ' ファイル | sed 's / * unicorn //'

それも処理します(ただし、問題1と2が残ります)。


2
 sed 's/^\(\([[:blank:]]*[^[:blank:]]\{1,\}\)\{4\}\)[[:blank:]]*[^[:blank:]]*/\1/' YourFile > Output.txt
  • スペース/タブ区切り文字に基づいたposix sed(メタクラス[:blank:]])
  • 5番目の単語の後に次のスペースを保持しますが、前のスペースは削除します

より堅牢な(sedは可能な限り長いパターンを使用し、パターン*は最初のバージョンで分離または単語を見逃す可能性があります)が、少し長いバージョン

sed 's/^\([[:blank:]]*\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{4\}\[^[:blank:]]\{1,\}/\1/' YourFile > Output.txt

1
sed 's/[^[:blank:]]*//5'
mikeserv

@mikeserv、これは両方の周囲のセパレータを保持しsed 's/[[:blank:]*[^[:blank:]]*//5'ますが、より良いです。非常に良い点。私はそれが実体として各単一文字を取るsedの疑いがあるが、それは実体としての最大のunbreakedパターンを取る
NeronLeVelu

sed 's/[[:blank:]][^[:blank:]]*//4'5番目のフィールドを完全に削除します。
mikeserv

@mikeserv行に開始スペースがないと仮定(サンプルのように)
NeronLeVelu

この場合、はい、あなたは正しいと思います。通常、このようなことはnullフィールドであり、動作は正しいでしょう。この場合、@ cuonglmのように実行し、毎回sed 's/[[:blank:]][^[:blank:]][^[:blank:]]*//4'、またはGNU / BSD / toybox seds:のような単語を参照するようにしてくださいsed -E 's/[[:blank:]][^[:blank:]]+//4'
mikeserv



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.