Если ваш тип контента уже является UTF8, то, скорее всего, данные уже поступают в неправильную кодировку. Если вы получаете данные из базы данных, убедитесь, что соединение с базой данных использует UTF-8.
Если это данные из файла, убедитесь, что файл правильно закодирован как UTF-8. Обычно вы можете установить это в диалоговом окне «Сохранить как ...» выбранного вами редактора.
Если данные уже нарушены при просмотре в исходном файле, скорее всего, это быть файлом UTF-8, но где-то в пути он был сохранен в неправильной кодировке.
В случае, если кто-то не хочет использовать ИЛИ не имеет nextfile
в своей системе, может помочь следующее.
awk -v ignore="file.4.dat" '
FNR==1{
no_parse=""
}
FNR==NR {
a[$1]=$2
next
}
FILENAME == ignore{
no_parse=1
}
no_parse{
next
}
($1 in a) {
a[$1]+=$2
}
END {
for(i in a)
print i,a[i]
}' file.4.dat file.[1-5].dat >| test.out
Создали переменную с именем ignore
, и мы могли бы упомянуть файл Input_file, который нам нужно игнорировать там, как только наступит поворот Input_file для разбора, я установил флаг с именем no_parse
в TRUE, в этом случае этот конкретный файл Input_file содержимое не будет прочитано (поскольку next
используется для пропуска всех дальнейших операторов)
Использование конвейерных awks. Вы должны предоставить последний файл как ссылку (здесь-> 4)
awk ' $(NF+1)=FILENAME' file.[1-3].dat file.5.dat file.4.dat |
awk ' { a[$1]+=$2; $2=a[$1] } /file.4.dat/ && NF-- '
с данными файлами
$ awk ' $(NF+1)=FILENAME' file.[1-3].dat file.5.dat file.4.dat |
awk ' { a[$1]+=$2; $2=a[$1] } /file.4.dat/ && NF-- '
25.636267 0.00398174
27.848542 0.00485739
28.269278 0.0174401
29.418886 0.00409613
31.313212 0.203932
31.945900 0.00667987
32.256620 0.00325607
32.299959 0.162935
33.461363 0.0798633
33.646214 0.122186
33.679538 0.249302
$
Вы можете просто сделать это в awk
, идентифицируя первый файл, который вы используете для справки, и игнорируя его для последующей обработки, используя опцию nextfile
(требуется версия GNU), которая пропускает обработку файла для последующей обработки. Исходя из этой логики, вы должны разместить справочный файл, например, file.4.dat
в качестве входных данных в качестве первого аргумента в списке файлов.
awk '
BEGIN{ ignoreFile = ARGV[1] }
NR==FNR {
a[$1]=$2
next
}
FILENAME == ignoreFile { nextfile }
($1 in a) {
a[$1]+=$2
}
END {
for(i in a)
print i,a[i]
}' file.4.dat file.[1-5].dat >| test.out
ОП хотел знать, могут ли они создать список шаблонов имен файлов, которые можно сгенерировать из оболочки и использовать. Это можно сделать, но, учитывая относительно более простой вариант, доступный в nextfile
, это может показаться сложным.
Из вашего понимания у вас есть n
файлы, и один из них будет использоваться в качестве справочного файла. Я бы предпочел использовать функцию extglob оболочки bash
, чтобы включить все файлы, кроме ссылки. Например, Я создаю файлы file1..10
для объяснения этого
touch file{1..10}
exclude=3
Параметры расширенной оболочки устанавливаются с помощью встроенного shopt
shopt -s extglob
list=(!(file"$exclude"))
. Теперь распечатайте массив, используя declare -p list
чтобы увидеть список файлов только с опорным файлом. Теперь используйте массив в вашем awk
, как показано ниже. Расширение массива "${list[@]}"
приводит к исключению всех файлов, сгенерированных вами выше.
awk ... file"$exclude" "${list[@]}"