2016-03-19 11 views
0

Ich habe eine Tab-separierte Datei mit folgendem Format:wenn dritte Spalte in der Datei nicht eindeutig zuzuordnen ist

January Jay RESERVED 4 
February Jay RESERVED 5 
March Jay SUBMITTED 6 
December Jay USED 7 

Was Ich mag würde, ist zu tun, Räume zu schaffen oder neue Linien zwischen den Zeilen, in denen Die dritte Spalte ist einzigartig.

Für dieses Beispiel würde ich diesen Ausgang mag:

January Jay RESERVED 4 
February Jay RESERVED 5 

March Jay SUBMITTED 6 

December Jay USED 7 
+0

Awk kann tabstoppgetrennte Tabellen lesen und sie kommagetrennte ausgeben. –

+0

Sie können Registerkarten in SO ausschneiden und einfügen. Es ist eine Browser-Sache. – LinuxDisciple

+0

Suchen Sie nach eindeutigen Werten, oder sind diese alle gruppiert und Sie möchten nur eine Leerzeile vor einem neuen Abschnitt? – miken32

Antwort

1

Wenn Ihre Daten in einer Datei Sachen genannt:

lastVal="";cat stuff |while read i ; do thisVal=$(echo "$i" |cut -d$'\t' -f'3'); if [ "$lastVal" != "$thisVal" ]; then echo "" ;lastVal=$thisVal; fi ;echo "$i" ;done 

Hier ist eine Version des gleichen Befehl, den Sie verwenden können, als ein Skript. Siehe Verwendung unten.

#!/bin/bash 
lastVal=""; 
while read i ; do 
    thisVal=$(echo "$i" |cut -d$'\t' -f'3') 
    if [ "$lastVal" != "$thisVal" ]; then 
     echo "" 
     lastVal=$thisVal 
    fi 
    echo "$i" 
done 


Wenn Sie das Skript myScript.bash nennen, können Sie es eine dieser beiden Arten verwenden:

cat yourfile | /path/to/myScript.bash 

oder

/path/to/MyScript.bash < yourfile 

Beachten Sie, wenn Sie Möchten Sie an der Bash-Eingabeaufforderung eine Literal-Registerkarte einfügen, können Sie Strg + V eingeben und dann die Tabulatortaste drücken. Mit Strg + v können Sie auch andere Sonderzeichen einfügen. Mit Strg + v können Sie spezielle Zeichen wie Tab eingeben, um TAB als Trennzeichen im ausgeschnittenen Teil hinzuzufügen, drücken Sie Strg-v und dann die Tabulatortaste (das ist in Linux, nicht SO).

+0

Dies bringt einen Platz zwischen jeder Zeile – user3299633

+0

Bitte formatieren Sie Ihren Code richtig! – miken32

+0

Nevermind, es hat richtig funktioniert. – user3299633

0

Awk kann dies ganz praktisch:

awk -F $'\t' '{print (v==$3 ? $0 : "\n"$0); v=$3}' foo.txt 

awk entwickelt, um mit Leerzeichen getrennte Spalten mit Daten zu arbeiten, so dass die dritte Spalte von $3 vertreten ist. Wir überprüfen lediglich, ob sich der Wert geändert hat, und print eine zusätzliche Zeile.

Hierbei wird nicht nach "eindeutigen" Werten gesucht, sondern nur nach einer Änderung des Werts aus der vorherigen Zeile. Soweit ich das beurteilen kann, ist das das Gleiche wie die Antwort, die Sie angenommen haben.

+0

Wenn Sie, F $ '\ t' hinzugefügt haben, denke ich, dass sie genau dasselbe Verhalten haben. Ohne dies funktioniert die awk-Antwort gut für Reservierungen, die von "Jay" gemacht wurden, aber nicht für "Mary Kate", da sie $ IFS verwendet, was Platz beinhaltet. – LinuxDisciple

+0

Guter Punkt, es ist nicht schade, FS ausdrücklich für Tab-getrennte Werte anzugeben. – miken32

Verwandte Themen