最後の行の末尾の「、」フィールド区切り文字を削除する方法は?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つ以上のカンマと一致します(文字通り「カンマ、ゼロ以上のカンマ」)。
別の方法は、次の問題を解決することです。生産する空のフィールドを出力しないデータです。