各行が終了するまで、ファイルの各行からスペースを削除します。

各行が終了するまで、ファイルの各行からスペースを削除します。

ファイル内の各行の最後の単語まで、各行のスペースを削除しようとしています。

入力ファイルの例:

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

sedandコマンドを試してみましたが、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つを使用してください。

関連情報