2016-11-26 1 views
-1

Ich habe eine txt-Datei, die eine einzelne Spalte einzelner Worte als solche enthält: die Worte verwendenZugabe von Zeichen am Ende jeder Saite in einer Datei

windfall 
winnable 
winner 
winners 
winning 

Ich möchte in der Datei als regulärer Ausdrücke für Ein Mapping-Job. Wenn die Worte fertig sollten wie folgt aussehen:

windfall|winnable|winner|winners|winning 

ich Python oder awk verwenden muß, um die Datei zu öffnen, einen Ort | am Ende jedes und schreibe den neuen Inhalt in eine neue Datei, wobei das neue Zeichen hinzugefügt und die Spalte in eine einzelne horizontale Zeile umgewandelt wird.

irgendwelche Vorschläge?

+0

Ja, tu das nicht. Dies ist ein [XY-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), fragen Sie uns nach Hilfe bei dem, was Sie nicht tun möchten, was Sie wollen TU es. –

Antwort

1

Python Verwenden Sie tun können:

with open('oldfile.txt') as fin: 
    with open('newfile.txt', 'w') as fout: 
     fout.write('|'.join(map(str.strip, fin))) 

Die str.split entfernt Zeilenumbrüche und Leerzeichen, während die join die Linien mit | verkettet.

3

Simplest ist tr:

tr '\n' '|' < file.txt 
+2

Dies wird ein abschließendes '|' und keine neue Zeile am Ende hinzufügen ... benutze 'einfügen -sd' | ' file.txt' stattdessen – Sundeep

+0

@Sundeep Deshalb habe ich nicht gepostet, aber der Titel der Frage ist _Add-Zeichen am Ende jeder Zeichenfolge _, Betonung auf _each_, –

+1

@JamesBrown wahrscheinlich schwer in Worten auszudrücken .. erwartete Ausgabe ist klar genug – Sundeep

0

sed Verwendung:

$ cat file 
windfall 
winnable 
winner 
winners 
winning 
$ sed ':a;N;s/\n/|/;ba' file 
windfall|winnable|winner|winners|winning 
  • eine Schleife erstellen :a
  • Laden der neuen Zeile N um Ausführungsraum
  • Ersatz der Neue-Zeile mit Rohr
  • Spülen und wiederholen verwenden.
0

In awk, wenn Sie nicht wollen, die Hinter |:

$ awk '{ s=s (NR>1"?"|":"") $0 } END { print s }' file 
windfall|winnable|winner|winners|winning 

Die ursprüngliche Version mit getline die im Grunde war ein (nicht einmal das) Ergebnis einer awk Jamming Sitzung war:

$ awk 'BEGIN { 
      while(r=getline) {   # read until EOF 
       s=s (p==r?"|":"") $0; # pile it to s, preceed with | after the first 
       p=r     # p revious r eturn value of getline 
      } print s     # out with the pile 
     }' file 
windfall|winnable|winner|winners|winning 
+0

Das wird bei Getline-Fehlern in eine Endlosschleife gehen. Unter http://awk.freeshell.org/AllAboutGetline erfahren Sie, wie und wann getline und seine vielen Vorbehalte zu verwenden sind. –

+0

@EdMorton Welche Art von Situation oder "getline" Fehler könnte eine Endlosschleife verursachen? Ich habe (noch einmal) diesen Link gelesen, konnte aber nicht schnell ein Schema entwickeln, das zu solchen Ergebnissen führen würde. Der einzige 'getline'-Fehler, den ich in diesem erwähnten Text sah, war _In POSIX-konformen Awks (z.B. gawk_posix) ein Fehler von getline (z.B.Der Versuch, aus einer nicht lesbaren Datei zu lesen) wird für das Programm fatal sein, sonst wird es nicht. Ich habe es ein wenig ausprobiert und nach 'chmod a-r file' scheitern beide Versionen (mit und ohne 'getline') 'fatal'ly,' getline' Version mit '--posix' auch beim Versuch ein Verzeichnis zu verarbeiten. –

+1

Per [POSIX] (http://pubs.opengroup.org/onlinepubs/009695399/utilities/awk.html) 'Alle Formen von getline sollen 1 für eine erfolgreiche Eingabe, 0 für das Dateiende und -1 für zurückgeben ein Fehler. Also in dieser Situation wirst du r auf -1 setzen und die Schleife eingeben und dann wird die nächste Iteration getline wieder fehlschlagen und so weiter. Wenn Sie nach einem bestimmten Testfall fragen, IDK ich nur den Aufruf robust (es ist nur ein paar zusätzliche Zeichen), so wird es das Problem behandeln, wenn es auftritt, da pro POSIX kann es auftreten, und dann habe ich nicht sich Sorgen darüber machen, wie es dazu kommen kann oder welche Awks bestimmte Ausfälle verursachen werden, wenn dies der Fall ist. –

0
awk -v RS= -v OFS="|" '/ /{next}$1=$1' file 

windfall|winnable|winner|winners|winning 
0

Verwendung paste:

$ cat /tmp/so.txt 
windfall 
winnable 
winner 
winners 
winning 

$ paste -sd'|' /tmp/so.txt 
windfall|winnable|winner|winners|winning 
Verwandte Themen