1

データの大きなリストを CSV に変換しようとしています。基本的にスペースのない巨大なリストで、行は改行で区切られています。基本的にドキュメントをループし、行を awk し、バイト範囲を切り取り、コンマを追加して行末に追加する bash スクリプトを作成しました。次のようになります。

awk -v n=$x 'NR==n { print;exit}' PROP.txt | cut -c 1-12      | tr -d '\n' >> $x.tmp
awk -v n=$x 'NR==n { print;exit}' PROP.txt | cut -c 13-17     | tr -d '\n' | xargs -I {} sed -i '' -e 's~$~,{}~' $x.tmp
awk -v n=$x 'NR==n { print;exit}' PROP.txt | cut -c 18-22     | tr -d '\n' | xargs -I {} sed -i '' -e 's~$~,{}~' $x.tmp
awk -v n=$x 'NR==n { print;exit}' PROP.txt | cut -c 23-34     | tr -d '\n' | xargs -I {} sed -i '' -e 's~$~,{}~' $x.tmp

問題は、これが非常に遅く、データに約 40 万行あることです。これを達成するためのより良い方法があるはずです。基本的に、行の 12/17/22/34 などの各文字の後にコンマを追加するだけです。

どんな助けでも大歓迎です、ありがとう!

4

3 に答える 3

2

Perl でこれを行う方法はたくさんあります。1 つの方法を次に示します。

perl -pe 's/(.{12})(.{5})(.{5})(.{12})/$1,$2,$3,$4,/' < input-file > output-file

置換の一致パターンは、各行の先頭から、12、5、5、および 12 の任意の文字を含む 4 つのテキスト グループをキャプチャします。置換パターンは、各グループの後にコンマを置きます。

于 2012-12-05T18:09:58.790 に答える
1

これは非常に仕事ですsubstr

use strict;
use warnings;

my @widths = (12, 5, 5, 12);
my $offset;

while (my $line = <DATA>) {
  for my $width (@widths) {
    $offset += $width;
    substr $line, $offset, 0, ',';
    ++$offset;
  }
  print $line;
}

__DATA__
1234567890123456789012345678901234567890

出力

123456789012,34567,89012,345678901234,567890
于 2012-12-05T23:57:36.117 に答える
1

GNU awk を使用すると、次のように記述できます。

gawk 'BEGIN {FIELDWIDTHS="12 5 5 12"; OFS=","} {$1=$1; print}'

その$1=$1部分は、何も変更せずに、出力フィールドセパレーターを組み込んで、awkに同様のものを強制的に書き直すことです。

于 2012-12-05T19:07:03.743 に答える