awk: слишком много выходных файлов 10 запись № 12 - PullRequest
0 голосов
/ 08 апреля 2019

Я получаю проблему при попытке разбить файлы. Кто-нибудь может мне помочь с этим?

Пример содержимого:

apple fruit
goa   fruit
tomato vegetable
tiger  animal 

Сценарий:

 #!/bin/bash
 awk 'FNR==1 { hdr = $0; next }
    {
        if(!f[$2]) { print hdr >"file" $2".htm"; f[$2] = 1 }
        print >>"file" $2".htm"
    }' samplefile.txt

Ответы [ 4 ]

1 голос
/ 08 апреля 2019

Не могли бы вы попробовать следующее (не проверено, поскольку образцы не приведены), в случае солнца o.s используйте /usr/xpg4/bin/awk ИЛИ /usr/xpg6/bin/awk (пожалуйста, обратитесь к комментариям в этом ответе для получения более подробной информации).

Похоже, что OP использовал OLD, сломанный awk, где функция close не работала в следующем решении, поэтому я предложил OP использовать xpg awk (s), позже Эд сэр подтвердил это тоже.

#!/bin/bash
 awk 'FNR==1 { hdr = $0; next }
    {
        if($2 != prev){close(file)}
        file="file" $2 ".htm"
        if(!f[$2]) {print hdr > file; f[$2] = 1 }
        print >> file
        prev=$2
    }' samplefile.txt

ИЛИ попробуйте:

#!/bin/bash
 awk 'FNR==1 { hdr = $0; next }
    {
        file="file" $2 ".htm"
        if(file!=prev){close(prev)}
        if(!f[$2]) {print hdr > file; f[$2] = 1 }
        print >> file
        prev=file
    }' samplefile.txt
0 голосов
/ 09 апреля 2019

Надеюсь, что разделив, вы хотите назначить каждое поле # 1 для соответствующего файла.Вот однострочный сценарий awk:

awk '$1 in uniqSet == 0 {uniqSet[$1]=1;system("echo "$1" >> file"$2".htm");}' input

Пояснения:

$1 in uniqSet == 0 обрабатывать только элементы, которые еще не разобраны, элемент не в uniqSet.

uniqSet[$1]=1; markэлемент в uniqSet as раздается.

system("echo "$1" >> file"$2".htm"); Выполнить команду bash "echo field#1 >> filefield#2.html"

0 голосов
/ 08 апреля 2019

Если вы не используете GNU awk (который делает это для вас в фоновом режиме), вам нужно вручную закрыть все файлы, открытые в результате перенаправления ввода или вывода, - вы открываете их вручную, чтобы вынужно вручную закрыть их:

awk '
    FNR==1 { hdr = $0; next }
    $2 != prev {
        close(out)
        out = "file" $2 ".htm"
        if ( !seen[out]++ ) {
            print hdr > out
        }
        prev = $2
    }
    { print >> out }
' samplefile.txt
0 голосов
/ 08 апреля 2019

Возможно, у вас закончились FD, используйте close() и попробуйте что-то вроде:

$ awk '
FNR==1 {
    hdr = $0
    next
}
{
    filename="file" $2 ".htm"
    if(!f[$2]) {
        print hdr >> filename
        f[$2] = 1
    }
    print >> filename
    close(filename)
}' file

О, TIL: Старый [Solaris] awk не имеет команды закрытия и даже не достаточно умен, чтобы выдать ошибку, говорящую "Я не знаю, что означает" близко ".

...