Как сделать awk Print 3 пункта в строке, последнее значение, если пустое?

POSIX_FADV_RANDOM отключает опережение чтения, выполняемое драйвером файловой системы ядра. Это советует уровню файловой системы не читать больше, чем было запрошено. Опережение чтения выполняется на уровне файла: уровень файловой системы может получить дополнительные данные из того же файла, но он не будет делать этого (много), если вы укажете POSIX_FADV_RANDOM.

hdparm -A 0 отключает опережение чтения, выполняемое самим диском. Это предупреждает диск, что когда вы читаете сектор, он не должен хранить следующие несколько секторов в своем внутреннем кэше.

Оба варианта отключают опережающее чтение, но на разных уровнях системы.

POSIX_FADV_RANDOM отключает только предвыборку. Установите регион в POSIX_FADV_DONTNEED, если вы не хотите, чтобы он кэшировался (или хотите удалить его из кэша).

0
18.12.2018, 09:47
2 ответа
$ awk -v OFS=',' '/^Name/ { if (line != "") print line; line = $0; next } { line = line OFS $0 } END { if (line != "") print line }' file
Name= Garen,Class= 9C,School= US
Name= Lulu,Class= 4A
Name= Kata,Class= 10D,School= UK

С обновленным вводом в вопросе это дает

Name= Garen,Class= 9C,Last Name= Wilson,School= US,
Name= Lulu,Class= 4A,Last Name= Miller,
Name= Kata,Class= 10D,School= UK,Last Name= Thomas

Если вы хотите удалить бит Last Name, игнорируйте его явно в коде awk:

$ awk -v OFS=',' '/^Last Name/ { next } /^Name/ { if (line != "") print line; line = $0; next } { line = line OFS $0 } END { if (line != "") print line }' file
Name= Garen,Class= 9C,School= US,
Name= Lulu,Class= 4A,
Name= Kata,Class= 10D,School= UK

Код awkв виде отдельной awkпрограммы с комментариями:

BEGIN {
    # Set output field separator to a comma.
    # This can also be done with -v OFS="," on the command line.

    OFS = ","
}

/^Last Name/ {
    # Ignore these lines
    next
}

/^Name/ {
    # A line starts with "Name".
    # Print the accumulated line and reset the line variable.
    # Continue immediately with next line of input.

    if (line != "")
        print line

    line = $0
    next
}

{
    # Accumulate lines in the line variable.
    # Delimit each input data with OFS (a comma).

    line = line OFS $0
}

END {
    # Print the last accumulated line.

    if (line != "")
        print line
}

Сsed(это почти идентичное решение из ответа на другой вопрос)

/^Last Name/ d;             # ignore these lines
/^Name/ b print_previous;   # print previous record
H;                          # append this line to hold space
$       b print_previous;   # print previous (last) record
d;                          # end processing this line

:print_previous;            # prints a record accumulated in the hold space
x;                          # swap in the hold space
/^$/ d;                     # if line is empty, delete it
s/\n/,/g;                   # replace embedded newlines by commas
                            # (implicit print)

Запуск:

$ sed -f script.sed file
Name= Garen,Class= 9C,School= US
Name= Lulu,Class= 4A
Name= Kata,Class= 10D,School= UK
0
28.01.2020, 04:07

Для этого можно использовать awkсо следующим вкладышем -, как показано ниже:

awk -F\< '/Name=/ {LGT=length($2);printf("\n%s,",substr($2,6,LGT))};
/Class=/ {LGT=length($2);printf(" %s,",substr($2,6,LGT))}; 
/School=/ {LGT=length($2);printf(" %s",substr($2,6,LGT))};
END {printf("\n") }' file.txt

Это решение будет печатать записи (, то есть строки в исходном file.txtфайле )в том порядке, в котором они появляются в file.txt. Я добавил его, потому что это (простой )пример того, как анализировать и манипулировать строками с помощью awk.

Как и в предыдущих ответах, файл file.txt содержит:

<text>Name= Garen</text>
<text>Class= 9C</text>
<text>School= US</text>
<text>Name= Lulu</text>
<text>Class= 4A</text>
<text>Name= Kata</text>
<text>Class= 10D</text>
<text>School= UK</text>

Выход::

Name= Garen, Class= 9C, School= US
Name= Lulu, Class= 4A
Name= Kata, Class= 10D, School= UK
0
28.01.2020, 04:07

Теги

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