Вы слишком усердно пытаетесь получить каталоги в текущем каталоге. Все, что вам нужно сделать, это:
for dir in */; do echo "dir: $dir"; done
#.........^^
Если вы хотите хранить их в массиве:
dirs=( */ )
$ 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 $row
arrayref.
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
Столбец 14 содержит не пустую строку, а ""
, поэтому вам нужно проверить две кавычки (, которые должны быть экранированы):
awk -F"," 'BEGIN {OFS=","} $14 == "\"\"" { $14 = "NA" } {print}' file1 > file2