2016-05-26 13 views
0

Ich bin wirklich neugierig: Gibt es ein Werkzeug kann helfen, Textverarbeitungsprogramme shell -> eine Spalte ausschneiden, für Textverarbeitungsprogramme zur Verfügung stellen und dann wieder einfügen.shell command deal mit nur einer Spalte

Zum Beispiel habe ich eine Datei:

3f27,tom,17 
6d44,jack,19 
139a,jerry,7 

Ich möchte Feld ändern 2, alle aeiou entfernen.

Ich weiß, es gibt viele Möglichkeiten, um dieses Problem zu umgehen. Aber warum stehen wir nicht davor?

Ich möchte ein Werkzeug, wie:

deal-only -d"," -f2 sed 's/[aeiou]//g' 

Dieses sauberer und leistungsstark ist.

Also, ist jemand so ein Werkzeug oder eine ähnliche Lösung bekannt? Wenn nein, möchte ich eins erstellen.


Wie ich oben gesagt, ich sed bekannt oder awk deutlich über Problem umgehen können. Aber wenn Sie ein komplexes Problem lösen, kann sed oder awk Sie nicht speichern.

deal-only -d"," -f2 ./ip2country.rb 

Hier möchte ich Spalte 2 von IP zu Land ändern.

+0

Das Ziel ist, dass Sie eigenen Code hinzufügen, um zumindest die Forschungsbemühungen zu zeigen, die Sie unternommen haben, um das Problem selbst zu lösen. – Cyrus

+0

awk ist sehr gut geeignet, um nur mit einer bestimmten Spalte zu arbeiten. awk Lösungen sind in der Regel sehr klar. Nach sed und awk wäre Perl oder Python das nächste mächtige Werkzeug. Und nur für eine andere Perspektive: Tabellen wie Excel oder Libreoffice sind auch ** sehr gut ** bei der Arbeit mit Spalten, sie haben eine reiche Funktionalität. –

+0

@Cyrus Ich aktualisierte das Problem. Und die zweite Anfrage ist das wirkliche Problem, das ich traf. Ich verbringe viel Zeit, um dieses Problem zu lösen. Ich möchte antworten, nicht für die Show. – pjincz

Antwort

0

können Sie verwenden, um die Koprozeß Merkmal bash (siehe zB here):

#!/bin/bash 

coproc stdbuf -oL sed 's/[aeiou]//g' 

while IFS="," read a b c ; do 
    echo "${b}" >&${COPROC[1]} 
    read -u ${COPROC[0]} b2 
    echo "${a},${b2},${c}" 
done 

einige zufällige Hinweise:

  • Diese POSIX nicht

  • die Standardausgabe des Prozesses, der die Spaltendaten * MUST filtert * line/ungepufferte gepuffert werden (dies ist der Teil stdbuf -oL - Abschnitt „Buffering“ in der oben sehen -mentioned Dokument)

  • (AFAIK) der gleiche Effekt kann durch das Laichen einen Hintergrundprozess und i/o redirection erreicht werden

  • (AFAIK) zwei Named Pipes einzigen E verknüpft xternal „resource-schwere“ Prozess-Eingabe/Ausgabe sollte auch funktionieren

  • Ich bin nicht 100% sicher, ob dies der beste Weg ist, aber es funktioniert für mich

Viel Glück!

1

Mit awk:

# script.awk 
BEGIN { FS="," } 
{print $1 "," gensub("[aeiou]+", "", "g", $2) "," $3} 

Dann:

awk -f script.awk < data.txt 
+0

Ich kenne diesen Weg, aber bedenken Sie folgendes Problem, Sie haben ein Skript: ip2country, lesen Sie ip Zeile für Zeile, und geben Sie Land Zeile für Zeile aus. 7391238c2 1.2.3.4 aaa xxx bbb 8987c2d3a 2.3.4.5 ddd eee rrr awk kann nicht helfen, sed kann auch nicht helfen. : p ip2country ist teuer zu starten, weil es viel Tabelle lesen muss. – pjincz