Сопоставление нескольких файлов с номерами и исключение одного из файлов по номеру

Если ваш тип контента уже является UTF8, то, скорее всего, данные уже поступают в неправильную кодировку. Если вы получаете данные из базы данных, убедитесь, что соединение с базой данных использует UTF-8.

Если это данные из файла, убедитесь, что файл правильно закодирован как UTF-8. Обычно вы можете установить это в диалоговом окне «Сохранить как ...» выбранного вами редактора.

Если данные уже нарушены при просмотре в исходном файле, скорее всего, это быть файлом UTF-8, но где-то в пути он был сохранен в неправильной кодировке.

1
задан Inian 5 March 2019 в 17:34
поделиться

3 ответа

В случае, если кто-то не хочет использовать ИЛИ не имеет 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 используется для пропуска всех дальнейших операторов)

0
ответ дан RavinderSingh13 5 March 2019 в 17:34
поделиться

Использование конвейерных 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

$
0
ответ дан stack0114106 5 March 2019 в 17:34
поделиться

Вы можете просто сделать это в 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[@]}"
0
ответ дан Inian 5 March 2019 в 17:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: