В зависимости от того, какой дистрибутив вы используете, в вашем безопасном журнале или журнале аудита должны быть указаны полные данные для входа в систему. Это простое быстрое исправление, позволяющее проверить, существуют ли они в /etc/passwd, но у вас могут возникнуть проблемы с повторяющимися именами пользователей.
Необходимо повторно -упорядочить renamefile
по длине, чтобы сначала заменить более длинные имена
awk '{ print length, $0 }' renamefile| sort -nr | cut -d" " -f2- > renamefile2
выход
s/\<Strawberry juice with lemon\>/3076/g
s/\<Orange juice with pulp\>/3072/g
s/\<Apple juice with lemon\>/3075/g
s/\<Watermelon juice\>/3074/g
s/\<Orange juice\>/3073/g
s/\<Apple juice\>/3071/g
Тогда вы можете без проблем подать заявку.
sed -f renamefile2 fileA
Описание:
awk
циклы по линиям
length
— это встроенный -в функции awk. при вызове без аргумента будет напечатан размер текущей строки (больше информации в длина awk)$0
текущая строка Следующая команда напечатает длину каждой строки рядом с самой строкой
awk '{ print length, $0 }' renamefile
24 s/\<Apple juice\>/3071/g
35 s/\<Orange juice with pulp\>/3072/g
25 s/\<Orange juice\>/3073/g
sort
сортирует введенный текст
-n
будет сортировать численно -r
инвертировать результат, чтобы сделать его нисходящим. cut
выберет часть текста (, так как нам не нужна длина в окончательном скрипте и нужно выбрать только sed
часть строк)
-d" "
указывает разделитель, который здесь space
. -f2-
от поля 2 до конца строки С awk проще:
$ cat tst.awk
BEGIN {
id = 3071
map["Apple juice"] = id++
map["Orange juice with pulp"] = id++
map["Orange juice"] = id++
map["Watermelon juice"] = id++
map["Apple juice with lemon"] = id++
map["Strawberry juice with lemon"] = id++
}
match($0,/^((\S+\s+){3})(.*\S)((\s+\S+){2})/,a) {
$0 = a[1] map[a[3]] a[4]
print
}
$ awk -f tst.awk file
AB12345 100 0 3071 20/05 AB
CD67890 150 0 3072 22/05 CS
EF25879 100 0 3074 19/05 CG
GH96314 98 0 3073 20/05 PU
IJ74123 95 0 3076 17/05 ST
В приведенном выше примере используется GNU awk, поскольку вы использовали GNU sed для границ слов \<
и \>
.
Используя GNU sed, мы сначала изменяем файл переименования динамически (, что означает, что вам не нужно делать какие-либо ручные изменения в нем ), а затем используем это как код sed для выполнения редактирования в файле A
Изменение, которое мы делаем в файле переименования, состоит в том, чтобы искать новую строку как правую границу, а не \>. Но перед этим мы вставляем новую строку в пространство шаблонов файла A.
$ sed -re '
1i\
s/(\\s+\\S+){2}\\s*$/\\n&/
s/\\>/\\n/
' renamefile | sed -rf - fileA
Выход:
AB12345 100 0 3071 20/05 AB
CD67890 150 0 3072 22/05 CS
EF25879 100 0 3074 19/05 CG
GH96314 98 0 3073 20/05 PU
IJ74123 95 0 3076 17/05 ST