2012-04-12 9 views
2

Dies ist ein Follow-up zu this Frage. Ich habe this Datei fester Breite, wo die Spaltenbreiten sind 34 2 3 2 2 1 2 2 1 1 2 2 1 2 2 2 und 65. Ich möchte dies in R nach dem Löschen der ersten und letzten Spalten lesen, wo die Die zweite Spalte hat den Wert "07". Dank Matte, wenn ich die TXT-Datei zu csv nur konvertieren will, ich es mit diesem Code tun.Piping Unix-Befehle

awk -v FIELDWIDTHS='34 2 3 2 2 1 2 2 1 1 2 2 1 2 2 2 65' -v OFS=',' '($2=='07'){ $1=$1 ''; print }' </filepath/pipe.txt | cut --delimiter=',' --fields=2- > /filepath/parsed.csv 

Natürlich kann ich dann lesen Sie die parsed.csv Datei in, aber ich versuche, es zu tun ein Schuss mit pipe(). wenn ich Rohr dieses in R versuchen, es hängt:

a = read.csv(pipe("awk -v FIELDWIDTHS='34 2 3 2 2 1 2 2 1 1 2 2 1 2 2 2 65' -v OFS=',' '($2=='07'){ $1=$1 ''; print }' 
        </filepath/pipe.txt 
        | cut --delimiter=',' --fields=2-") 
      , header=F, colClasses="character") 
+0

Bitte fügen Sie SOLVED nicht zu Ihrem Titel hinzu, sondern kreuzen Sie die richtige Antwort an ... Außerdem möchten Sie vielleicht Ihren Namen von dem standardmäßig generierten zu einem aussagekräftigeren ändern (aber das ist nur meine Meinung). –

+0

Paul, ich habe "gelöst" hinzugefügt, weil es keine "richtige" Antwort gab. Das Problem lag in der Frage selbst, über welche Erkenntnis ich selbst stolperte. Bitte beachten Sie die folgenden Hinweise. – user702432

+0

Ich verstehe die Situation. Ich würde dir empfehlen, deine Antwort so zu bearbeiten, dass sie eine Beschreibung von dem enthält, was dein Problem gelöst hat, und diese Antwort akzeptierst. Dies ist für SO vollkommen akzeptabel. –

Antwort

3

Ich bin nicht sicher pipe() aber ich würde es mit system() tun.

library(stringr) 
txt <- system("awk -v FIELDWIDTHS='34 2 3 2 2 1 2 2 1 1 2 2 1 2 2 2 65' -v OFS=',' '($2=='07'){ $1=$1 ''; print }' < pipe.txt | cut --delimiter=',' --fields=2-", intern=T) 
do.call(rbind, str_split(txt, ",")) 
0

jigr (und andere Leser) - Ich fand die seltsamste Eigenart in R/RStudio. Der Code in meiner Frage perfekt funktioniert, vorausgesetzt, es gibt keinen Zeilenumbruch:

a = read.csv(pipe("awk -v FIELDWIDTHS='34 2 3 2 2 1 2 2 1 1 2 2 1 2 2 2 65' -v OFS=',''($2=='07'){ $1=$1 ''; print }' </filepath/pipe.txt | cut --delimiter=',' --fields=2-"), header=F, colClasses="character") 

Ich habe nicht die geringste Ahnung, warum dies geschieht.

+0

So funktioniert die Shell. Du hättest auch nur das '|' Char-up und es hätte funktioniert, weil dann der Shell-Parser erwartet, dass der Befehl in der nächsten Zeile fortgesetzt wird. Apropos Fortfahren, Sie könnten auch '\' (ohne die einfachen Anführungszeichen) am Ende der ersten Zeile verwenden. Es wird oft als Fortsetzungszeichen bezeichnet und muss das letzte Zeichen auf der Zeile sein, Leerzeichen, nachdem es die Dinge durcheinander bringt. Viel Glück. – shellter

+0

Nun, ich lebe und lerne. Danke für die Tipps, Unterkunft. – user702432