
Ich habe eine Datei, die nicht in der richtigen Reihenfolge ist. Ich möchte sie mithilfe einer zweiten Datei neu ordnen.
Datei 1
1 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0
2 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2315=27:2316=NAR@4;2317=eng@106:2318;2319=eng:0:21020:2:2066:0
3 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2320=27:2321=NAR@4;2322=eng@106:2323;2324=eng:0:21030:2:2066:0
ITV HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0
Und eine zweite Datei
3 HD
1 HD
2 HD
Ich möchte Datei zwei scannen und Datei 1 neu anordnen, und Reste werden am Ende der Datei geändert, so dass das Endergebnis ist
3 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2320=27:2321=NAR@4;2322=eng@106:2323;2324=eng:0:21030:2:2066:0
1 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0
2 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2315=27:2316=NAR@4;2317=eng@106:2318;2319=eng:0:21020:2:2066:0
ITV HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0
Irgendwelche Ideen?
Dank im Voraus.
Antwort1
Je nach Größe der Datei wäre das Laden jeder Zeile in ein Array die einfachste Möglichkeit, dies zu handhaben. Verwenden Sie Ihre Indexdatei, um einen Objektschlüssel (Verweis auf das Element im Array) abzurufen, und schreiben Sie diese Zeile, Schleife usw.
Ich sehe, Sie haben Linux/Bash getaggt, hier also einige hilfreiche Informationen.
Bash-Arrays haben nur nummerierte Indizes, aber diese sind spärlich besetzt, d. h. Sie müssen nicht alle Indizes definieren. Ein ganzes Array kann zugewiesen werden, indem die Array-Elemente in Klammern eingeschlossen werden:
arr=(Hello World)
Einzelne Elemente können mit der bekannten Array-Syntax zugewiesen werden (sofern Sie nicht an Basic oder Fortran gewöhnt sind):
arr[0]=Hello
arr[1]=World
Etwas hässlich wird es jedoch, wenn Sie auf ein Array-Element verweisen möchten:
echo ${arr[0]} ${arr[1]}
Um aus der Manpage zu zitieren: Die Klammern sind erforderlich, um Konflikte mit der Pfadnamenerweiterung zu vermeiden.
Darüber hinaus sind folgende ausgefallene Konstrukte verfügbar:
${arr[*]} # All of the items in the array
${!arr[*]} # All of the indexes in the array
${#arr[*]} # Number of items in the array
${#arr[0]} # Length of item zero
${!arr[*]} ist eine relativ neue Ergänzung zu Bash, es war nicht Teil der ursprünglichen Array-Implementierung.
Das folgende Beispiel zeigt die einfache Verwendung von Arrays (beachten Sie die Zuweisung „[index]=value“ zum Zuweisen eines bestimmten Indexes):
#!/bin/bash
array=(one two three four [5]=five)
echo "Array size: ${#array[*]}"
echo "Array items:"
for item in ${array[*]}
do
printf " %s\n" $item
done
echo "Array indexes:"
for index in ${!array[*]}
do
printf " %d\n" $index
done
echo "Array items and indexes:"
for index in ${!array[*]}
do
printf "%4d: %s\n" $index ${array[$index]}
done
Beim Ausführen wird die folgende Ausgabe erzeugt: Array-Größe: 5 Array-Elemente:
one
two
three
four
five
Array-Indizes:
0
1
2
3
5
Array-Elemente und Indizes:
0: one
1: two
2: three
3: four
5: five
Beachten Sie, dass das "@"-Zeichen anstelle des " verwendet werden kann." in Konstrukten wie ${arr[]}, das Ergebnis ist das gleiche, außer wenn auf die Elemente des Arrays innerhalb einer Zeichenfolge mit Anführungszeichen erweitert wird. In diesem Fall ist das Verhalten das gleiche wie bei der Erweiterung von "$" und "$@" innerhalb von Anführungszeichen: "${arr[]}“ gibt alle Elemente als ein einzelnes Wort zurück, während „${arr[@]}“ jedes Element als separates Wort zurückgibt.
Weitere Informationen zu Bash-Arrays finden Sie unterhttp://www.linuxjournal.com/content/bash-arrays
Um eine Datei in ein Array zu laden, können Sie beispielsweise Folgendes verwenden, indem Sie mit der Variable X einen Index zum Array hinzufügen, oder Sie können innerhalb der Schleife einen benutzerdefinierten Index abrufen.
#!/bin/sh
files="`cat $1`"
for x in $lines
echo "$x"
done
Antwort2
awk -F';' '
NR == FNR {a[$1] = $0; next}
{print a[$0]; delete a[$0]}
END {for (l in a) print a[l]}' file1 file2