awk-вывести последнее значение столбца со значением по умолчанию, если null

awk-вывести последнее значение столбца со значением по умолчанию, если null

12.12.2017 01:35:18 Просмотров 20 Источник

Я использую команду awk для печати значений. Для последнего столбца, если значение не найдено, мне нужно, чтобы он напечатал NA.

Экс., в приведенном ниже коде, когда $3равно NULL, мне нужно напечатать как NA.

Есть ли в любом случае я мог бы включить if/ isnullили что-то еще.

awk -F"    " '{ print $1,"|", $2, "|", $3 }' log_temp.txt > log_template.txt
У вопроса есть решение - Посмотреть?

Ответы - awk-вывести последнее значение столбца со значением по умолчанию, если null / awk - Print last column value with default value if null

Является ответом!
Akshay Hegde

12.12.2017 01:58:53

Есть ли в любом случае я мог бы включить условие "если" / "isnull" или что-то еще.

Вам нужно использовать тернарный оператор

Синтаксис:

condition ? value_if_true : value_if_false

Для 3-й колонки

awk '{ print ($3==""?"NA":$3) }' infile

так оно и становится

awk '{ print $1, "|" , $2, "|",  ($3==""?"NA":$3) }' infile

Вы также можете установить переменную разделителя выходных полей (OFS)

awk -v OFS='|' '{ print $1, $2, ($3=="" ? "NA" : $3) }' infile

print ($3=="" ? "NA" : $3)это то же самое, что

if( $3=="" ){
    print "NA"
}else{
    print $3
}  

Для последнего столбца вы можете использовать NF-последний столбец

https://stackoverflow.com/questions/47770452/awk-print-last-column-value-with-default-value-if-null/47770944#comment82503146_47770944
Большое спасибо. Именно этого я и хотел. Вопрос: есть ли в любом случае я мог бы динамически получить количество столбцов вместо жесткого кодирования, как print $1, $2, $3 и т. д.,.
https://stackoverflow.com/questions/47770452/awk-print-last-column-value-with-default-value-if-null/47770944#comment82503168_47770944
переменная NF не дает никаких полей в записи, предположим, что вы хотите, чтобы проверить все поля, то вы можете просто петли, как awk -v OFS='|' '{for(i=1; i<=NF; i++)if($i=="")$i="NA"; $1=$1}1' infile, если null тогда установить NA, $1=$1 используется в случае, если ни одно из полей имеют значение null, но вы можете использовать разделитель выходных полей как |, то она изменяет разделителя полей в записи, и 1 в конце делает печать запись
https://stackoverflow.com/questions/47770452/awk-print-last-column-value-with-default-value-if-null/47770944#comment82503751_47770944
на awk -F" и " -в ОФС='|' '{для(i=1; я<=НФ; я++)если($я=="")$я="на"}1' log_temp.тхт > log_template.формат txt...............................................................................................СПАСИБО. Я попробовал это. Но я не получаю ожидаемый результат, разделенный'|', как это было раньше. Я просто получаю то, что было во входных данных.
https://stackoverflow.com/questions/47770452/awk-print-last-column-value-with-default-value-if-null/47770944#comment82503863_47770944
на awk использовать единое пространство по умолчанию разделитель полей так что не нужно использовать -F" ", чтобы понять, как над одним работает, вы можете попробовать это : echo '1,,3' | awk -F, -v OFS='|' '{for(i=1; i<=NF; i++)if($i=="")$i="NA"; $1=$1}1' бы выход 1|NA|3
https://stackoverflow.com/questions/47770452/awk-print-last-column-value-with-default-value-if-null/47770944#comment82504264_47770944
Спасибо за объяснение. Как вы делаете формат в разделе комментариев? Мой код на самом деле имеет 4 "пробелов" в качестве разделителя. он был отформатирован, когда я вставил копию в поле для комментариев. Таким образом, во входном файле разделителем является "4 пробела", и когда я пишу его на выход, мне нужно разделять с помощью"|". Он отлично работает, когда я печатаю жесткий код $1, $2 и т. д.,. Но когда я пытаюсь использовать функцию 'NF', не используя print,это не дает желаемого результата. Извините, что я новичок в Unix-скриптинге, я делаю это как часть события challenge, в котором я участвую.
https://stackoverflow.com/questions/47770452/awk-print-last-column-value-with-default-value-if-null/47770944#comment82504437_47770944
видишь stackoverflow.com/editing-help , awk вычисляет нет полей на основе разделителя, вероятно, в вашем случае нет полей не согласованы, так что если вы уже знаете, сколько полей есть в вашем файле, вы можете использовать непосредственно заменить NF на ваш номер, как for(i=1; i<=10; i++)
https://stackoverflow.com/questions/47770452/awk-print-last-column-value-with-default-value-if-null/47770944#comment82504804_47770944
Да. Нет полей различаются между линиями. Так что вышеприведенный подход может быть применен только в том случае, если нет.поля постоянны среди линий?
https://stackoverflow.com/questions/47770452/awk-print-last-column-value-with-default-value-if-null/47770944#comment82505208_47770944
И спасибо @akshay. Это из-за таких добрых людей, как вы, Интернет - такое замечательное место :)
https://stackoverflow.com/questions/47770452/awk-print-last-column-value-with-default-value-if-null/47770944#comment82512416_47770944
Да, поскольку у вас есть разделенные пробелами столбцы, awk будет иметь трудности с предсказанием полей, когда встречаются нулевые поля, я надеюсь, что вы поняли мою точку зрения.
https://stackoverflow.com/questions/47770452/awk-print-last-column-value-with-default-value-if-null/47770944#comment82527191_47770944
Просто имейте в виду, что print $3==""?"NA":$3и т. д. произведет синтаксическую ошибку в некоторых awks. Всегда заключайте в скобки свои тернарные выражения, например print ($3==""?"NA":$3) даже неловко, когда в этом нет необходимости, он улучшает ясность.
https://stackoverflow.com/questions/47770452/awk-print-last-column-value-with-default-value-if-null/47770944#comment82531901_47770944
@EdMorton добавил скобки, как вы и предлагали, спасибо.
https://stackoverflow.com/questions/47770452/awk-print-last-column-value-with-default-value-if-null/47770944#comment82545858_47770944
Отличный. Один пример awk, который произвел бы синтаксическую ошибку без них, учитывая, что код OSX awk.
ctac_

12.12.2017 08:20:43

Вы можете использовать sed для этой задачи.

Если разделитель - "4 пробела" во входном файле.

Вы можете установить var с количеством полей

field=3
# set the number of fields
sed '
s/\([^ ][^ ]*\)/&/'"$field"'
# match each field and operate the substitution on the last field
t
# if the last field is not empty jump to end
s/$/    NA/
# substitute the end of line with delimiter (4 spaces) and NA
' infile

cat infile 
aaaa    bbbb    cccc
dddd    eeee
ffff    gggg    hhhh
iiii    jjjj

output
aaaa    bbbb    cccc
dddd    eeee    NA
ffff    gggg    hhhh
iiii    jjjj    NA
Закрыть X