Команда AWK - Редактировать пустую «Ячейку» в CSV в текстовое значение

Вы слишком усердно пытаетесь получить каталоги в текущем каталоге. Все, что вам нужно сделать, это:

for dir in */; do echo "dir: $dir"; done
#.........^^

Если вы хотите хранить их в массиве:

dirs=( */ )
1
26.09.2019, 05:43
2 ответа
$ perl -MText::CSV=csv -e '
  $csv = Text::CSV->new();
  while(my $row = $csv->getline(ARGV)) {
    $row->[13] = "NA" if ($row->[13] eq "");
    $csv->say(STDOUT, $row);
  };' input.csv

Обратите внимание, что массивы perl начинаются с 0, а не с 1 -, поэтому 14-е поле является элементом 13 $rowarrayref.

employee_number,employee_login,is_active,send_pkg_email,send_na_email,last_name,first_name,department,title,phone_number,employee_type,email,charge_code,area_code,mailstop,roomid
103293,jsmith@company.com,Y,,,Smith,Jessica,,,"+1 (650) 3530975",Employee,jsmith@company.com,,LOC0028.03,,03.C.01H
103295,fredl@company.com,Y,,,Long,Fred,,,"+1 (415) 9449428",Employee,fredl@company.com,,LOC0025.01,,01.D.04B
103297,lcheng@company.com,Y,,,Cheng,Laura,,,"+1 (650) 8623342",Contingent,lcheng@company.com,,NA,,
103307,cfb@company.com,Y,,,Brown,Chris,,,"+1 (512) 9644927",Employee,cfb@company.com,,ATX0607.16,,16.B.10D
103310,stanwang@company.com,Y,,,Williams,Stan,,,"+1 (650) 8048591",Employee,stanwang@company.com,,LOC0061.03,,03.D.01B

Строка с номером сотрудника _103297теперь содержит NA в 14-м поле.

Кстати, поля вывода здесь двойные -, цитируемые только при необходимости (, например. когда они содержат пробел. или если какое-либо из них содержало запятую, они тоже брались в кавычки ). Если вы предпочитаете, чтобы все поля в выходных данных были заключены в кавычки, как во входном файле, измените строку $csv = Text::CSV->new();на :

.
$csv = Text::CSV->new({always_quote => 1});

Текст ::CSV имеет множество других опций. например. если вы используете $csv = Text::CSV->new({always_quote => 1, strict => 1});, это также вызовет ошибку, если какая-либо из входных строк имеет другое количество полей. Подробности см. в man Text::CSV.


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

awk -F"," 'BEGIN {OFS=","}; $14 == "\"\"" { $14 = "\"NA\"" };1' input.csv

Это указывает на проблему с разделением CSV-файлов только запятой -. Невозможно провести различие между символами "как обертками данных поля и символами ", являющимися частью данных поля... потому что в этом простом методе разделения такого различия нет.

Поле 14 не пусто, когда вы просто разделяете строку ввода запятыми. Он содержит две кавычки("").

Эта строка awk one -также не работает, если какое-либо из полей содержит символ запятой. Это еще одна причина, по которой лучше использовать парсер CSV.

См. Существует ли надежный инструмент командной строки для обработки CSV-файлов? .

Также есть хороший парсер awk csv по адресуhttps://github.com/geoffroy-aubry/awk-csv-parser

1
27.01.2020, 23:30

Столбец 14 содержит не пустую строку, а "", поэтому вам нужно проверить две кавычки (, которые должны быть экранированы):

awk -F"," 'BEGIN {OFS=","} $14 == "\"\"" { $14 = "NA" } {print}' file1 > file2
1
27.01.2020, 23:30

Теги

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