Ergebnis:

Ergebnis:

Beginnen wir mit den Grundlagen: Ich habe eine Datei, die eine Nummer, ein oder mehrere Leerzeichen und dann einen Dateinamen (einschließlich Pfad) enthält. Der Dateiname und der Pfad könnten auch Leerzeichen enthalten.

Ich möchte awkdie Komponenten trennen und bei weiteren Tests auf Gleichheit zwischen diesen Feldern in separaten Dateien verwenden.

Um nur das erste Problem zu behandeln. Dies ist die Datei:

111  aaa/aaa
222  b b/bbb
333  ccc/c c
444  d d/d d

Als Ausgabe würde ich gerne Folgendes sehen:

aaa/aaa 111
b b/bbb 222
ccc/c c 222
d d/d d 222

Das Wesentliche hier ist nicht das Format der obigen Ausgabe, sondern die Möglichkeit $1, $2und $3weiter im awkAusdruck verwenden zu können, nachdem diese Variablen festgelegt wurden. Obwohl es sich hier nur um eine Datei handelt, vergleiche ich eigentlich zwei Dateisätze, muss mich aber zuerst mit dieser Komponente vertraut machen.

$1sollte die alphanumerische Sequenz am Anfang der Zeile enthalten, $2sollte den gesamten Pfad (ohne den Dateinamen) enthalten und $3sollte nur den Dateinamen enthalten

Ich habe versucht, das FSwährend des Programms zu ändern, aber es funktioniert einfach nicht:

$ awk 'BEGIN{OFS=" || "}{FS=" ";a[$1]=1;FS="/";b[$NF]=1;print $1, $2, $NF}' file1
111 || dir1/a || aa
222 dir1 || bbb || bbb
333 dir1 || c cc || c cc
444 dir1 || ddd || ddd
555 dir2 || e ee || e ee
666 dir2 || fff || fff
999 dir2 || zzz || zzz

Nicht nur, dass der FSSchrägstrich entfernt wird, die erste Variable ist auch einfach falsch, weil sie nur die zweite verwendet.FS

Antwort1

Ich verstehe nicht wirklich, warum Sie das tun müssen, aber Sie könnten (zum Beispiel) das eindeutig durch Leerzeichen getrennte speichern und entfernen $1und dann den Rest mit dem alternativen Trennzeichen aufteilen. Zum Beispiel:

$ awk '
   {
      a=$1; $1=""; sub(/^ */,""); 
      n=split($0,p,"/"); 
      $1=a; for(i=1;i<=n;i++) $(i+1) = p[i]
   } {
     print $2"/"$3, $1
   }' file
aaa/aaa 111
b b/bbb 222
ccc/c c 333
d d/d d 444

Antwort2

while read -r f1 fpath; do
   printf '%s\t%s\n' "$fpath" "$f1"
done < file1

Ich bin nicht sicher, was Sie wollen, aber Sie machen die Sache viel komplizierter als nötig.

Ergebnis:

aaa/aaa 111
b b/bbb 222
ccc/c c 333
d d/d d 444

verwandte Informationen