staging.inyokaproject.org

Ausgabe einer Liste mit Yad und Aufteilung in Spalten

Status: Gelöst | Ubuntu-Version: Xubuntu 20.04 (Focal Fossa)
Antworten |

Fried-rich

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Hallo,

ich habe in einem Skript sowas in Verwendung:

echo "$list" | yad --width=500 --height=400 --list --separator="" --column=""

Yad gib mir die Liste in einem Fenster aus, egal wie lang die Liste ist. Da wird aber jede Zeile in eine einzige Spalte geschrieben. Kann man die Liste auch in Saplten aufteilen, z. B. so:

echo "$name" "$vorname" | yad --width=500 --height=400 --list --separator="" --column=""

mit der Liste

manuel neuer
thomas müller
joshua kimmich

Yad soll dann eine Liste mit 3 Zeilen erstellen und jeweils den Namen und Vornamen in eine eigene Spalte in der gleichen Zeile schreiben. Mit einem zweiten "--column" wir ddas nichts, da wird dann die 2. Zeile der Liste in die zweite Spalte eingetragen.

TNTMaster

Anmeldungsdatum:
30. Juli 2009

Beiträge: 879

Problem ist: yad lest die Argumente zeilenweise ein, Abhilfe schafft das Aufsplitten der Zeile in 2 Argumente.

Spontan fallen mir 2 Lösungen ein:

1
for i in $list; do echo "$i"; done | yad --width=500 --height=400 --list --separator=" " --column="Vorname" --column="Nachname"
1
echo "$list" | xargs yad --width=500 --height=400 --list --separator=" " --column="Vorname" --column="Nachname"

Gruß TNT

Nachtrag: Lösung 3: Du kannst die Argumente auch direkt im yad Befehl als Argumente übergeben:

1
yad --width=500 --height=400 --list --separator=" " --column="Vorname" --column="Nachname" $list

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Lösung 2 geht, da aber xargs standardmäßig Leerzeichen als Trennzeichen nimmt, ich aber Leerzeichen im Zeileninhalt habe, musste ich vorher immer ein '*' anhängen und dann xargs mit -d "* aufrufen.

Lösung 1 und 3 gehen nicht. Bei Lösung 1 wird ja mit dem Inhalt nichts gemacht. Die ganze Zeile wird nur ausgegeben ohne sie aufzusplitten.

Bei Lösung 3 werden immer die Leerzeichen als Trenner verwendet, auch wenn ich --separator="*" verwende.

EDIT

Komisch bei Lösung 2 ist aber, dass die 2. Zeile die doppelte Zeilenhöhe hat wie die Zeile 1 obwohl der Inhalt gleich lang ist. Der Inhalt einer Spalte wird ganz unten, die beiden anderen mittig angezeigt.

EDIT1

Bzgl. der Zeilenhöhe habe ich eine Vermutung. Wenn die Liste so aussieht:

manuel*neuer
thomas*mueller

wird durch xargs 'neuer' und 'thomas' als eins interpretiert. Ich musste also nochmal Trenner an das Ende anfügen.

manuel*neuer*
thomas*mueller*

Evtl. wird jetzt einfach eine zusätzliche leere Zeile vor 'thomas' gesetzt?

TNTMaster

Anmeldungsdatum:
30. Juli 2009

Beiträge: 879

Lösung 2 geht, da aber xargs standardmäßig Leerzeichen als Trennzeichen nimmt, ich aber Leerzeichen im Zeileninhalt habe, musste ich vorher immer ein '*' anhängen und dann xargs mit -d "* aufrufen.

Du hast pro Zeile 2 Wörter, nämlich Vorname und Nachname, die mit Leerzeichen getrennt sind. Sind 3 oder mehrere Wörter in der Zeile bsp. 2 Vornamen, klappt das nicht mehr und alles verschiebt sich um eine Stelle.

Lösung 1 und 3 gehen nicht. Bei Lösung 1 wird ja mit dem Inhalt nichts gemacht. Die ganze Zeile wird nur ausgegeben ohne sie aufzusplitten.

Beachte das Quoting! Ist die Variable von Anführungszeichen umschlossen, wird das als 1 Argument an yad übergeben, yad splittet dann am Zeilenumbruch, und zwar in 3, statt wie erwartet in 6 Teile, wenn man deine Liste als Beispiel nimmt.

Bei Lösung 3 werden immer die Leerzeichen als Trenner verwendet, auch wenn ich --separator="*" verwende.

Lies die manpage von yad --separator ist der Trenner für die Ausgabe, nicht für die Eingabe. Ich habe das so verstanden, du hast Vor- und Nachname mit einem Leerzeichen getrennt in einer Zeile, wie es dein Beispiel auch zeigt. Argument 1 (manuel) wird Spalte 1 (Vorname) zugeordnet, Argument 2 (neuer) in Spalte 2 (Nachname), Argument 3 (thomas) kommt in Spalte 1, usw. Es kommen also alle Argumente mit ungerader Zahl(Argument 1,3,5) in Spalte 1, die mit geraden Zahlen in Spalte 2

Komisch bei Lösung 2 ist aber, dass die 2. Zeile die doppelte Zeilenhöhe hat wie die Zeile 1 obwohl der Inhalt gleich lang ist. Der Inhalt einer Spalte wird ganz unten, die beiden anderen mittig angezeigt.

Das kann ich so nicht nachstellen.

Wie wird die Liste erstellt? Besteht die Liste immer aus genau Vorname und Nachname, getrennt mit Leerzeichen? Möglicherweise ist es praktischer ein Array mit den Daten zu füllen und an yad zu übergeben.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

So wie ich das verstehe erwartet yad bei der Listenangabe einzelne Elemente als Parameter (falls man es nicht explizit vom stdin lesen lässt), d.h. angenommen man hat eine Datei data.txt mit dem Inhalt

manuel neuer
thomas müller
joshua kimmich

Dann muss man die erst mal so aufbereiten, dass man eine Abfolge der einzelnen Elemente enthält (was problematisch sein kann, wenn der IFS in den einzelnen Feldern vorkommt, daher sollte man immer einen eindeutigen Trenner haben) - für das Beispiel genügt sowas:

1
yad --width=500 --height=500 --list  --column="Vorname" --column="Nachnahme" $(paste -s -d " " data.txt)

bzw. wenn man einen mehrzeiligen String in einer Variable hat:

1
2
data=$(cat data.txt)
yad --width=500 --height=500 --list  --column="Vorname" --column="Nachnahme" $(paste -s -d " " <<< "$data")

Wenn man jetzt z.B. Tabs als Feldtrenner hätte und Spaces in den Feldern vorkommen dürften - Beispiel-Datei schauspieler.txt:

Alexandra Maria	Lara
Joy Lee Juana	Abiola-Müller
Cristina Maria	Ablinger

Dann muss man den IFS beim Auftrennen der Elemente passend setzen - da bietet es sich an die Daten in ein Array umzupacken:

declare -a data
while IFS=$'\t' read -r vorname nachname
do
    data+=("$vorname" "$nachname")
done < schauspieler.txt
yad --width=500 --height=500 --list  --column="Vorname" --column="Nachnahme" "${data[@]}" 

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

@ TNTMaster

Vermutlich wird das mit einem Array in der Tat besser gehen als mit Variablen, damit habe ich aber wenig Erfahrung, muss ich erstmal testen.

@ seahawk1986

Das Script funktioniert erstmal, ich muss das aber erstmal verstehen. Danke dafür.

Antworten |