So ersetzen Sie alle Vorkommen von Zeichenfolgenmustern durch Zahlen, die mit der Zeichenfolge übereinstimmen, die von der Reihenfolge abhängt, in der die Zeichenfolgen gefunden wurden
Ich benötige ein Bash-Skript, das nach einer Zeichenfolge darin sucht. <>
Wenn es eine findet, die es vorher nicht gefunden hat, sollte es durch den aktuellen Wert des Indexzählers (0 am Anfang) ersetzt und der Zähler erhöht werden. Wenn es eine Zeichenfolge findet <>
, die es bereits kennt, sollte es den Index der Zeichenfolge nachschlagen und durch den Index ersetzen. Dies sollte über mehrere Dateien hinweg erfolgen, dh der Zähler wird nicht zurückgesetzt, wenn mehrere Dateien nach den Mustern durchsucht werden, sondern nur beim Programmstart
file_a.txt:
<abc>
<b>
<c>
<c>
<abc>
file_b.txt:
<c>
<b>
Soll werden
file_a.txt:
0
1
2
2
0
file_b.txt:
2
1
Was ich bisher bekommen habe:
names=()
for file in folder/*.txt
do
name=$(sed 's/\<[a-zA-Z]*\> /\1 /' file) for i in "${names[@]}"
do
if [ "$i" -eq "$name" ]
then
#replace string with index of string in array
else
names+=("$name")
fi
done
done
Bearbeiten: Um das Problem zu vereinfachen, habe ich nicht erwähnt, dass die zu ersetzenden Muster nicht der einzige Text in den Dateien sind, was bedeutet, dass die Dateien folgendermaßen aussehen:
file_a.txt:
123abc<abc>xyz
efg
<b>ah
a<c>
<c>b
c<abc>
file_b.txt:
xyz<c>xyz
xyz<b>xyz
Soll werden
file_a.txt:
123abc0xyz
efg
1ah
a2
2b
c0
file_b.txt:
xyz2xyz
xyz1xyz
Da die Dateien sehr groß sein können, sollten sie nicht kopiert, sondern nur bearbeitet werden. Dies sollte für alle Dateien in einem Ordner und für Dateien in Unterordnern erfolgen
Antworten
Sie können dieses awk-Skript ausprobieren:
mkdir -p tmp
awk 'match($0, /<[^>]+>/) { k = substr($0, RSTART, RLENGTH)
if (!(k in freq))
freq[k] = n++
$0 = substr($0, 1, RSTART-1) freq[k] substr($0, RSTART+RLENGTH) } { print $0 > ("tmp/" FILENAME)
}' file_{a,b}.txt
Geänderte Dateien werden im tmp/
Verzeichnis gespeichert und können nach Überprüfung des Inhalts wieder verschoben werden.
cat tmp/file_a.txt
123abc0xyz
efg
1ah
a2
2b
c0
cat tmp/file_b.txt
xyz2xyz
xyz1xyz