如何使用sed或awk从行分隔符更改为CSV

时间:2016-05-16 14:25:07

标签: linux bash awk sed

是否可以拥有以下数据集:

| asn-query: 
| BGP: 8.8.8.0/24 | Country: US
|   Origin AS: 15169 - GOOGLE - Google Inc., US
|    Peer AS: 1103 1239 2381 3257 6453

使用sed \ awk

转换为此结构
asn-query, BGP: 8.8.8.0/24,  Country: US, Origin AS: 15169 - GOOGLE - Google Inc., US, Peer AS: 1103 1239 2381 3257 6453

5 个答案:

答案 0 :(得分:1)

如果您的文件包含上述文本的多个块,例如,如果您的文件包含:

| asn-query: 
| BGP: 8.8.8.0/24 | Country: US
|   Origin AS: 15169 - GOOGLE - Google Inc., US
|    Peer AS: 1103 1239 2381 3257 6453
| asn-query: 
| BGP: 2.2.2.0/24 | Country: XX
|   Origin AS: 11111 - XXXXX - YYYYY Inc., US
|    Peer AS: 1212 1313 1414 1515 1616

您可以使用paste实用程序将每4行连接到一行,例如

paste - - - - < the_above_file.txt

会产生两行:

| asn-query:    | BGP: 8.8.8.0/24 | Country: US |   Origin AS: 15169 - GOOGLE - Google Inc., US |    Peer AS: 1103 1239 2381 3257 6453
| asn-query:    | BGP: 2.2.2.0/24 | Country: XX |   Origin AS: 11111 - XXXXX - YYYYY Inc., US   |    Peer AS: 1212 1313 1414 1515 1616

并可以根据需要修改每一行,例如:

paste  - - - - < asn.txt | sed 's/\|[[:blank:]]*//;s/://;s/[[:blank:]]*\|[[:blank:]]*/,/g'

将产生:

asn-query,BGP: 8.8.8.0/24,Country: US,Origin AS: 15169 - GOOGLE - Google Inc., US,Peer AS: 1103 1239 2381 3257 6453
asn-query,BGP: 2.2.2.0/24,Country: XX,Origin AS: 11111 - XXXXX - YYYYY Inc., US,Peer AS: 1212 1313 1414 1515 1616

使用perl(并解释)

paste  - - - - < asn  |  perl -plE 's/\|\s*//; s/://; s/\s*\|\s*/,/g'
                                    ^^^^^^^^^  ^^^^^  ^^^^^^^^^^^^^^
                                       ^         ^        ^
replace the 1st |+spaces with nothing--+         |        |
                                                 |        |
replace the 1st : with nothing ------------------+        |
                                                          |
replace all spaces + | + spaces with , -------------------+

答案 1 :(得分:0)

这应该有效:

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n//g' -e 's/|[[:blank:]]//g' file

有关解释,see this answer

或者你可以使用tr简化它(很多):

sed -e 's/|[[:blank:]]//g' file |tr -d '\n'

在第二种方法中,您将无法使用seds'-i标志来执行就地编辑。你可以用这个:

echo "$(sed -e 's/|[[:blank:]]//g' file |tr -d '\n')" > file

作为就地编辑的替代方案,或使用其他文件:

sed -e 's/|[[:blank:]]//g' file |tr -d '\n' > newfile

答案 2 :(得分:0)

cat file | xargs echo -n | sed -e 's/ |/,/g' -e 's/:,/,/g' -e 's/| //g'

答案 3 :(得分:0)

$ awk -v RS='^$' -v ORS= -F'\\s*\\|\\s*' -v OFS=', ' '{sub(FS,"");$1=$1}1' file
asn-query:, BGP: 8.8.8.0/24, Country: US, Origin AS: 15169 - GOOGLE - Google Inc., US, Peer AS: 1103 1239 2381 3257 6453

以上是由于多字符RS而特定的gawk,并且通过阅读Arnold Robbins的书“Effective Awk Programming,4th Edition”来解释。

答案 4 :(得分:0)

您可以使用此gnu awk命令:

awk -v RS='(: *)?\n*\\|[[:blank:]]*' -v ORS=', ' 'NR>1 && RT; END{printf "%s", $0}' file

asn-query, BGP: 8.8.8.0/24 , Country: US, Origin AS: 15169 - GOOGLE - Google Inc., US, Peer AS: 1103 1239 2381 3257 6453