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

Nov 25 2020

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

3 anubhava Nov 25 2020 at 03:10

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