csvファイルのすべての空のセル(値なし)に値(例 )を入力する必要があります。sedを使用してどのように行うことができますか?1
3 に答える
6
控えめに言っても、 sed、awk 、またはPerlのワンライナーを使用してCSVファイルを操作することは楽観的だと思います。フォーマットが変更された場合、フィールドにセパレータが含まれている場合はどうなりますか?非常にシンプルで効率的なText::CSV_XSを使用することをお勧めします。通常、あなたが求めているものなどの単純なタスクは、ほんの数行しか必要としません。Text::CSV_XS
適切に構成されたインスタンス( )が与えられた場合$csv
、それは次の問題のみになります。
while ( my $row = $csv->getline( $in ) ) {
my @new_row = map { defined $_ ? $_ : 1 } @$row;
$csv->print( \*STDOUT, \@new_row );
}
それでもコマンドラインを直接使用したい場合は、csv(App :: CSV)を調べることができます。これは、IMOが前述の代替手段よりも賢明なアプローチを採用しています。
于 2013-03-06T10:33:45.580 に答える
3
それはで行うことができますawk
。あなたは試すことができます:
awk '{for(i=1; i<=NF; i++) if($i=="") $i=1}1' FS=, OFS=, file
-----
ラーセンのコメントを読んで、引用されたフィールドが発生するかどうかを示すサンプルをOPが実際に投稿していないという意味で、彼は正しいことに気付きました.. .
awk '
{
for(i=1; i<=NF; i++) { # For every field
if($i=="") # it is empty
$i=1 # then make it 1 requirement OP
else {
f=$i # set `f` to the current field
while( gsub(/"/,"&",f )%2 && i<NF ) f=f $(++i) # while the total number of double quotes is odd, keep adding the next field to the current field and ignore it..
}
}
}
1 # print the record
' FS=, OFS=, file # set the I/O field separators to `,`
または1行で:
awk '{for(i=1; i<=NF; i++) if($i=="") $i=1; else { f=$i; while( gsub(/"/,"&",f)%2 && i<NF) f=f $(++i)}}1' FS=, OFS=, file
この入力によるテスト:
,1997,Ford,,"Super, ""luxurious"" ,,,truck",,
0,1997,Ford,,"Super, ""luxurious"" ,,,truck",,,,
プロデュース:
1,1997,Ford,1,"Super, ""luxurious"" ,,,truck",1,1
0,1997,Ford,1,"Super, ""luxurious"" ,,,truck",1,1,1,1
于 2013-03-06T09:44:27.427 に答える
2
どうですか:
$ cat file
v,,v,,,v,v,,,,
,,v,,v,v,,,v,,,v
,,,,,,,,,,,,,,
$ sed -e 's/^,/v,/' -e':a;s/,,/,v,/;ta' -e 's/,$/,v/' file
v,v,v,v,v,v,v,v,v,v,v
v,v,v,v,v,v,v,v,v,v,v,v
v,v,v,v,v,v,v,v,v,v,v,v,v,v,v
-i
変更に満足している場合は、オプションを使用して変更をファイルに保存します。
$ sed -i -e 's/^,/v,/' -e':a;s/,,/,v,/;ta' -e 's/,$/,v/' file
于 2013-03-06T09:20:58.997 に答える