ファイル内の各行の最後の単語まで、各行のスペースを削除しようとしています。
入力ファイルの例:
808 0 C01124 Amazon 45/234Birch 00 YYY
808 0 C01184 Flipkart 45/234Lotus 01 YYY
808 0 C01186 PrimeTime 45/23XCCCCH 08 YYY
808 0 C01125 DMART 5/23PPPPPPP 09 YYY
形式は上記と少し似ており、間隔が不均一であり、最後の単語は常に「YYY」です。私の要件は次のとおりです。 YYY以降のスペースは保持し、他のスペースはすべて削除したいと思います。
希望の出力:
8080C01124Amazon45/234Birch00YYY
8080C01184Flipkart45/234Lotus01YYY
8080C01186PrimeTime45/23XCCCCH08YYY
8080C01125DMART5/23PPPPPPP09YYY
sed
andコマンドを試してみましたが、tr
めちゃくちゃになり、すべての行が1つになります。上記のように分離したいのですが、要件を満たすことはできません。どうすればいいですか?
答え1
方法はさまざまです。少なくとも私にとって最も明白なのは、sedでループを使用することです。
sed -e :loop -e 's/ *\(.*YYY\)/\1/;t loop'
(最初のスラッシュの後に2つのスペースがあります。)ただの:loop
ラベルです。s/ *\(.*YYY\)/\1/
1つ以上のスペース、その後の任意のアイテム、次にYYYを一致させ、先行スペースなしで同じコンテンツに置き換えます。置換が発生した場合は、t loop
ラベルを確認してください。ループを通過するたびにYYYより前のスペースを削除します。 YYYの後は空白には何も届きません。
答え2
そしてperl
、
perl -pe 's{\s.*YYY}{$& =~ s/\s//gr}e'
YYY
埋め込み行の一番右の項目の左側にあるすべてのASCIIスペース文字が削除されますYYY
。
答え3
awk '{$1=$1}1' OFS= your_file
それはあなたが必要とするすべてです。フィールド(この場合は最初のフィールド)に割り当てると、追加のエントリがすべて削除され、空のOFSはフィールドを分離せずに一緒にリンクします。
答え4
あなたが尋ねる質問に対する答えは次のとおりです。
sed 's/ *\([^ ]\)/\1/g'
これは、タブではなく一般的な空白のみを扱っていると仮定します。空白以外の文字が続く空白文字列を見つけ、それを空白以外の文字に置き換えます。これはグローバルに行われます(各行でできるだけ数回)。行の末尾にあるスペース(最後の単語の後ろ)を除くすべてのスペースは、その後にスペース以外の文字がないため削除されます。
YYY
これは最後の単語が何であるかに関係なく機能します(必ずしもそうではありません)。スペースのみを含む行は変更されずに渡されます。
本当に削除したい場合みんなスペースがある場合は、これを行うにはより簡単な答えの1つを使用してください。