1

ファイルがあるとします:

その形式は次のとおりです: number, string1 , [string2] ,....

ここでは、string1 に「,」を含めないでください。これは、「,」を使用して各列を区切っているためですが、何らかの理由で string1 の中に「,」が含まれているため、「-」などの他の記号に置き換える必要があるためです。

1,aaa,bbb,ccc,[x,y,z],eee,fff,ggg
2,q,w,[x],f,g
3,z,[y],g,h
4,zzz,xxx,ccc,vvv,[z],g,h
....

に改訂する必要があります:

1,aaa-bbb-ccc,[x,y,z],eee,fff,ggg
2,q-w,[x],f,g
3,z,[y],g,h
4,zzz-xxx-ccc-vvv,[z],g,h
....

プログラミングせずにそれを行う最良の方法は何ですか。つまり、シェルプログラミング、python、c ++などではなく、awk、sed、vimを使用するだけです

ありがとう

4

3 に答える 3

1
$ awk -F, 'BEGIN{OFS=FS} {two=$0;sub($1 FS,"",two);sub(/,[[].*/,"",two);gsub(/,/,"-",two); rest=$0;sub(/^[^[]*/,"",rest); print $1,two,rest}' input.txt 
1,aaa-bbb-ccc,[x,y,z],eee,fff,ggg
2,q-w,[x],f,g
3,z,[y],g,h
4,zzz-xxx-ccc-vvv,[z],g,h
$ 

簡単にコメントできるように、awk スクリプトを分解してみましょう。

$ awk -F, '
  BEGIN { OFS=FS }
  {
    two=$0;                # Second field is based on the line...
    sub($1 FS,"",two);     # Remove the first field,
    sub(/,[[].*/,"",two);  # Remove everything from the [ onwards,
    gsub(/,/,"-",two);     # Replace commas in whatever remains.

    rest=$0;               # Last part of the line, after "two"
    sub(/^[^[]*/,"",rest); # Strip everything up to the [

    print $1,two,rest;     # Print it.
  }
' input.txt 
于 2012-07-19T03:47:13.780 に答える
1

sed少し長いですが、次のように使用できます。

sed ':loop; s/\([0-9]\+,.*\)\([^,]*\),\([^,]*\)\(.*,\[\)/\1\2-\3\4/; t loop' \
     input_file

少し短いもの:

sed ':loop; s/\([0-9]*,[^\[,]*\),\([^\[,]*,\[\)/\1-\2/; t loop' input_file

2 番目の説明:

loop while there are matches                   # :loop;
  1) find numbers followed by a comma,         #   \([0-9]*,
       followed by anything not comma or '[',  #   [^\[,]*\)
  2) find comma                                #   ,
  3) find anything not ',' or '['              #   \([^\[,]*
  4) followed by a ',' and '['                 #   ,\[\)/
  5) replace the whole thing with
       match of step 1 and '-' and matches 
       from steps 3-4                          #   /\1-\2/;
end loop

                                   # t loop
于 2012-07-19T03:35:53.750 に答える
0

これはうまくいくかもしれません(GNU sed):

sed -e 's/,\[/\n&/;h;s/\n.*//;s/,/-/2g;G;s/\n.*\n//' file
于 2012-07-19T06:11:38.593 に答える