2012-07-05 51 views
3

我是awk的新手,無法完全找出實現此目的的最佳方法。 我有成千上萬的XML文件,我已經使用sed和awk在單個文件中刪除了重複項並將字段分割成單個列。使用Awk創建一條csv行

現在我想將列表組裝成包含一行上多個字段的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 

由於

回答

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 

這有點hackey的,不過,如果你使用XML開始時,你應該考慮使用XSLT。

+0

謝謝,看上去很不錯! – 2012-07-05 18:01:20

+1

使用'xargs -a input'而不是'cat'。 – 2012-07-05 18:42:27

+0

@ Dennis:或者'xargs ... cha0site 2012-07-05 19:54:26

2

如果每線將有相同數量的領域,比方說,5,我會做類似

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

NR是awk和閱讀%的行數是餘數運算符。因此,如果讀取的行數是5的倍數(在這種情況下),它將打印一個換行符,否則它將打印一個逗號。

這假定您的示例中每行一個字段,並且輸入中的空白行將對應於CSV中的空白字段。使用sed

2

方式一:

內容的 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 
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