2014-02-08 2 views
1

У меня есть этот файлЗаменить значения столбцов в файле CSV с AWK

error.log

[00: 00: 00,284], 501,

[00: 00: 00,417] , 5,5294100071980

[00: 00: 02,463], 501,

[00: 00: 05,169], 501,

[00: 00: 05,529], 501,

[00: 00: 05,730], 501,

так, если поле $ 3 его пустой я хочу, чтобы напечатать "Нет значения"

Im пытается этот код

awk '{{FS=","} if($3=="") {print $1,$2,"No value"}}' 

Но он печатает

>[00:00:00.284] 501 No value 
>[00:00:02.463] 501 No value 
>[00:00:05.169] 501 No value 
>[00:00:05.529] 501 No value 
>[00:00:05.730] 501 No value 
>[00:00:07.193] 501 No value 
>[00:00:09.899] 501 No value 
>[00:00:31.312] 501 No value 
+1

Вы действительно имеют пустые строки между каждой реальной линией данных в вашем входном файле? –

ответ

8
awk -F ',' -v OFS=',' '$1 { if ($3=="") $3="No value"; print}' in.txt 
  • Пропускает разделитель полей через опцию -F.
  • Переменный OFS, разделитель выходного поля, установлен на ,, так что выходные поля также разделяются ,.
  • Образец $1 гарантирует, что обрабатываются только непустые строки (то есть связанное действие выполняется только в том случае, если первое поле не пустое) - , если ваш входной файл не имеет пустых строк, вы можете удалить этот шаблон ,
  • Если третье поле пуст, ему назначается строка «Нет значения»
  • И наконец, выводится строка (с потенциально измененным 3-м полем).

выше, как я предлагаю вам подойти к решению проблемы, но вот проблемы с вашей оригинальной командой:

  • {{FS=","}... Внутри вашего одиночного действия - что из-за не имея предшествующий рисунка выполнена для каждой строки ввода - вы устанавливаете переменную FSдля каждой строки - что не только не нужно, но и слишком поздно, потому что первая строка ввода уже была проанализирована к этому времени (спасибо, @EdMorton) - либо установить ее в BEGIN блок (BEGIN { FS="," }) или, как в моем ответе, с опцией командной строки -F (-F ',').
  • if($3=="") {...}
    Вы только производить выход, если поле $3 пусто - по-видимому, однако, вы хотите вывести все линий, так что при таком подходе вы бы нужна else ветви (для печати неизмененных строк).
  • print $1,$2,"No value"
    , символы. вот часть синтаксиса - они просто разделяют аргументы, переданные на print. Учитывая отдельные аргументы, print объединяет их со значением специальной переменной OFS, значением которой является одиночное пространство по умолчанию; вместо этого использовать ,, вы должны назначить его OFS - снова, либо в блоке BEGIN, либо через опцию -v (-v OFS=',').
+1

'{FS =", "} ... [не проблема функционально, но неэффективно]' Проблема, поскольку она не будет выполняться до тех пор, пока первая строка входного файла не будет разделена на поля с использованием FS по умолчанию. –

+1

@EdMorton Хорошая точка, спасибо - ответ обновлен. – mklement0

+1

Мы можем сказать из опубликованного ввода, что $ 3 может быть числовым, и мы знаем, что он хочет напечатать «Нет значения», когда он пуст, но он не говорит, что он не может иметь числовое значение 0, поэтому тестирование '! $ 3 'это не то же самое, что тестирование для« пустого », это будет' $ 3 == "" '. –

2

Вы должны опубликовать некоторые ожидаемые результаты, но я думаю, что вы хотите:

awk 'BEGIN{FS=OFS=","} NF{print $1, $2, ($3=="" ? "No value" : $3)}' file 
+1

+1 для элегантности. (Единственное, на что нужно обратить внимание - необходимо было обобщение IF - это то, что решение ограничено тремя выходными столбцами). – mklement0

2

С помощью этого файла

cat file 
[00:00:00.284],501, 
[00:00:00.417],5,5294100071980 
[00:00:02.463],501, 
[00:00:05.169],501, 
[00:00:05.529],501, 
[00:00:05.730],501, 

Этот awk должен сделать

awk -F, '$3=="" {$3="No value"}1' OFS=, file 
[00:00:00.284],501,No value 
[00:00:00.417],5,5294100071980 
[00:00:02.463],501,No value 
[00:00:05.169],501,No value 
[00:00:05.529],501,No value 
[00:00:05.730],501,No value 
+0

+1 для подтверждения; Мне любопытно, почему вы выбрали псевдо-имя файла 'OFS =,' над формой опции '-v OFS =,' - просто набрав удобство? Семантика тонко отличается, хотя в этом случае они работают одинаково. (Кроме того, вы предполагаете, что нет пустых строк, что, вероятно, справедливое предположение.) – mklement0

+0

Просто, чтобы сохранить три символа :) '-v' никакой другой причины. – Jotne

Смежные вопросы