2016-05-16 4 views
1

Ist es möglich, die die folgende Datensatz zu haben:wie sed oder awk verwenden, aus Zeilentrennzeichen in CSV zu ändern

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

in diese Struktur umgewandelt werden, 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 
mit
+0

Gibt es Rohrsymbole am Anfang jeder Zeile? – anubhava

+1

Ja, es ist sicherlich möglich ... es sieht so aus, als ob du nur versuchst, die Arbeit an jemand anderen auszulagern. – wojtow

+0

Die 3 Stunden, die ich in den Versuch investiert habe, um dies zu arbeiten, hat nicht das Gefühl, die Arbeit an jemand anderen auszulagern, ich habe gerade gelernt, aufzuhören und um Hilfe zu bitten. – user2512450

Antwort

1

Wenn Ihre Datei mehrere Blöcke des obigen Textes, zum Beispiel, wenn Sie Ihre Datei enthält:

| 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 

Sie die paste verwenden könnten Dienstprogramm, um alle 4 Zeilen zu einer Zeile zu verbinden, z

paste - - - - < the_above_file.txt 

werden zwei Linien produzieren:

| 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 

und könnte jede Zeile ändern, wie Sie wollen, zum Beispiel:

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

produzieren:

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 

Verwendung derselben Perl (und erklärt)

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 , -------------------+ 
0

Dies sollte funktionieren:

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

Zur Erläuterung see this answer.

Oder Sie können es (viel) vereinfachen tr mit:

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

In diesem zweiten Verfahren werden Sie nicht seds nutzen können -i Flagge bearbeiten in-place auszuführen.

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

als Alternative an Ort und Stelle zu bearbeiten oder eine andere Datei verwenden: Sie können damit

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

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

+0

Katzendatei | xargs -L | sed 's/| /,/g' | sed 's /, //' Dies ist möglich –

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 

Die oben ist gaffen spezifische aufgrund Multi-Char RS und wird durch Lesen des Buches Effective Awk Programming, 4. Auflage, von Arnold Robbins erklärt.

0

Sie können dieses Gnu awk Befehl:

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 
Verwandte Themen