3

私はawkを初めて使用するので、これを行うための最良の方法を完全に理解することはできません。sedとawkを使用して、重複を削除し、フィールドを1つのファイルの1つの列に分割した数千のxmlファイルがあります。

次に、リストを1行に複数のフィールドを含むcsvファイルにアセンブルします。一定数のフィールドの後、新しい行を開始したいと思います。

1234
2345

345678
4.23456E3
54321
654321
789

87654.100
9876

10.0
1234
2345

345678
4.23456E3
54321
654321
789

87654.100
9876

11.0

出力

1234, 2345, , 345678, 4.23456E3, 54321, 654321, 789, , 87654.100, 9876, , 10.0
1234, 2345, , 345678, 4.23456E3, 54321, 654321, 789, , 87654.100, 9876, , 11.0

ありがとう

4

4 に答える 4

2

使用はxargs許可されていますか?

cat input | xargs -L13 -d'\n' | sed -e 's/ /, /g'

私はここでこの出力を取得します:

1234, 2345, , 345678, 4.23456E3, 54321, 654321, 789, , 87654.100, 9876, , 10.0
1234, 2345, , 345678, 4.23456E3, 54321, 654321, 789, , 87654.100, 9876, , 11.0

これは一種のハッキーですが、XMLを使い始めた場合は、XSLTの使用を検討する必要があります。

于 2012-07-05T17:57:17.260 に答える
2

すべての行に同じ数のフィールドがある場合、たとえば 5 の場合、次のようにします。

awk ' { printf("%s",$1); if (NR % 5 == 0) {printf("\n")} else {printf(",")}}' youtfile.txt

NR は awk によって読み取られる行数で、% は剰余演算子です。したがって、読み取った行数が 5 の倍数 (この場合) の場合は改行が出力され、それ以外の場合はカンマが出力されます。

これは、例のように1行に1つのフィールドがあり、入力の空白行がCSVの空白フィールドに対応することを前提としています。

于 2012-07-05T18:00:27.323 に答える
2

を使用した片道sed

の内容script.sed:

## Label 'a'
:a

## If last line, print what is left in the buffer, substituting
## newlines with commas.
$ {
    s/^\n//
    s/\n/, /g
    p   
    q   
}

## If content of buffer has 12 newlines, we have reached to the limit
## of the line, so remove newlines with commas, print and delete buffer
## overwritting it with 'b'
/\([^\n]*\n\)\{12\}/ {
    s/^\n//
    s/\n/, /g
    p   
    b   
}

## Here buffer has not reached to the limit of fields for each line, so
## append one more (N) and continue loop in label 'a'
N
ba

次のように実行します。

sed -nf script.sed infile

次の出力で:

1234, 2345, , 345678, 4.23456E3, 54321, 654321, 789, , 87654.100, 9876, , 10.0
1234, 2345, , 345678, 4.23456E3, 54321, 654321, 789, , 87654.100, 9876, , 11.0
于 2012-07-05T18:19:33.557 に答える
0

これはあなたのために働くかもしれません:

paste -sd',,,,,,,,,,,,\n' file | sed 's/,/, /g'
1234, 2345, , 345678, 4.23456E3, 54321, 654321, 789, , 87654.100, 9876, , 10.0
1234, 2345, , 345678, 4.23456E3, 54321, 654321, 789, , 87654.100, 9876, , 11.0

またはこれ(GNU sed):

sed ':a;$bb;N;s/\n/&/12;Ta;:b;s/\n/, /g' file
1234, 2345, , 345678, 4.23456E3, 54321, 654321, 789, , 87654.100, 9876, , 10.0
1234, 2345, , 345678, 4.23456E3, 54321, 654321, 789, , 87654.100, 9876, , 11.0
于 2012-07-05T19:02:50.580 に答える