Neuordnen einer Datei basierend auf einer zweiten Datei

Neuordnen einer Datei basierend auf einer zweiten Datei

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

verwandte Informationen