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 awk
die 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
, $2
und $3
weiter im awk
Ausdruck 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.
$1
sollte die alphanumerische Sequenz am Anfang der Zeile enthalten,
$2
sollte den gesamten Pfad (ohne den Dateinamen) enthalten und
$3
sollte nur den Dateinamen enthalten
Ich habe versucht, das FS
wä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 FS
Schrä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 $1
und 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