最後の行で終わるフィールド区切り文字を削除するには?

最後の行で終わるフィールド区切り文字を削除するには?

最後の行の末尾の「、」フィールド区切り文字を削除する方法は?sed//awk線形perl

csvファイルの例:

zoo.cfg,autopurge.purgeInterval,24,
zoo.cfg,autopurge.snapRetainCount,30,,,,
zoo.cfg,clientPort,2181,
zoo.cfg,dataDir,/var/hadoop/zookeeper,
zoo.cfg,initLimit,10,,
zoo.cfg,syncLimit,5,1,1,,
zoo.cfg,tickTime,2000,,,,,,,,,,

予想出力:

zoo.cfg,autopurge.purgeInterval,24
zoo.cfg,autopurge.snapRetainCount,30
zoo.cfg,clientPort,2181
zoo.cfg,dataDir,/var/hadoop/zookeeper
zoo.cfg,initLimit,10
zoo.cfg,syncLimit,5,1,1
zoo.cfg,tickTime,2000
  • 目標 - 各行から不要な終了フィールド区切り文字「、」または「、、」または「、、、」などを削除します。

答え1

使用sed:

sed 's/,*$//' infile

これは、各行の末尾にある0個以上のカンマと一致します。一部の実装では、最後に1つ以上を一致させるようにsed指示できます。sed

sed 's/,\+$//' infile

(ポータブル/標準に対応するものなので、または同じことを行うことも,\{1,\}できます)。,,*,*

またはGNUと互換性があるかgrep

grep -o '.*[^,]'

これにより、コンマではなく最後の文字まですべての内容が印刷されます-o(空白行を削除する副作用がありますが)。

またはGNUを使用するか、awk次を使用しますmawk

awk '1' RS=',*\n'  #or
awk '1' RS=',+\n'

これが正義ですエココードSewlineが表示されるまで,*\n(0個のカンマまたは(1個以上のカンマ)),+\nの正規表現として演算子を使用します。\n

1一つしかありません。いつも事実条件、これによりレコードが印刷され、無視されます。RS

またはperl:

perl -pe 's/,*$//' #or
perl -pe 's/,+$//' 

答え2

$ sed 's/,,*$//' input

これにより、行の末尾にあるすべてのコンマが何もなく置き換えられます(削除されます)。

,,*$行の末尾にある1つ以上のカンマと一致します(文字通り「カンマ、ゼロ以上のカンマ」)。

別の方法は、次の問題を解決することです。生産する空のフィールドを出力しないデータです。

関連情報