シェルスクリプトを使用してセミコロンで区切られたファイルのフィールドからスペースを削除する

シェルスクリプトを使用してセミコロンで区切られたファイルのフィールドからスペースを削除する

次のCSVファイルがあります。

03139; 5;        IT1234978208; 20150930  ;  CTZ 13/31.12.15;
03137; 6;        IT1234978206; 20151015  ;  CTZ 13/31.11.18;
....
....
03134; 8;        IT1234974406; 20151212  ;  CTZ 13/37.13.17;

sedKorn Shellのコマンドを使用して、次のような結果を得ることで、各csv行からすべてのスペースを削除する回避策を探しています。

03139;5;IT1234978208;20150930;CTZ 13/31.12.15;
03137;6;IT1234978206;20151015;CTZ 13/31.11.18;
....
....
03134;8;IT1234974406;20151212;CTZ 13/37.13.17;

誰でも私を助けることができますか?

答え1

セミコロンの前後の空白だけを削除したいようです。この場合:

$ sed 's/[[:space:]]*;[[:space:]]*/;/g' text
03139;5;IT1234978208;20150930;CTZ 13/31.12.15;
03137;6;IT1234978206;20151015;CTZ 13/31.11.18;
....
....
03134;8;IT1234974406;20151212;CTZ 13/37.13.17;

仕組み:

sed置換コマンドは通常、正規表現がs/old/new/どこにあるかと同じです。oldこの場合は、g次を表すサフィックスを追加します。グローバル交換(インスタンスを1つだけ交換する代わりに)。この例では、olda;と周囲のスペースと一致しますs/[[:space:]]*;[[:space:]]*。これはnew単にaに置き換えられます;

答え2

私はperlあなたがsplitできるように答えますjoin

#!/usr/bin/env perl
use strict;
use warnings;

while ( <DATA> ) {
   chomp;
   my @fields = split /;/; 
   s/\s+//g for @fields;
   print join ";", @fields, "\n";
}

__DATA__
03139; 5;        IT1234978208; 20150930  ;  CTZ 13/31.12.15;
03137; 6;        IT1234978206; 20151015  ;  CTZ 13/31.11.18;
03134; 8;        IT1234974406; 20151212  ;  CTZ 13/37.13.17;

フィールドのすべてのスペースを削除すると、次のようになります。

03139;5;IT1234978208;20150930;CTZ13/31.12.15;
03137;6;IT1234978206;20151015;CTZ13/31.11.18;
03134;8;IT1234974406;20151212;CTZ13/37.13.17;

ただし、先行/末尾の空白のみを削除したい場合:

@フィールドの場合、s / ^ \ s + | \ s + $ / / g;

これは1行に減らすことができます。

perl -F; -lape 's/^\s+|\s+$//g for @F; print join ";", @F;'

どこ:

  • -F;区切り記号の設定
  • -l行末の自動削除/再追加を指します。
  • -a-F自動分割(区切り文字またはスペースのデフォルト)。
  • -e「この作品の実行」です。

関連情報