Другое awk
решение:
awk -F\" '{
OFS="\"";
for ( i = 1; i <= NF; i++ ) {
if ( i % 2 == 0 ) {
gsub(/,/, "", $i)
}
}
}1' input.csv
Это будет использовать двойную кавычку в качестве разделителя полей и циклически проходить по всем полям. Если номер поля является четным числом (, что не является доказательством дурака -, но в вашем примере это должно означать, что поле существует между кавычками ), оно удалит все запятые из этого поля.1
приведет к тому, что awk
напечатает все (с внесенными изменениями ), используя двойную кавычку в качестве разделителя выходных полей.
Используется:
$ cat input.csv
,7/30/2019,7/31/2019,Wed,8/1/2019,FH/FN 30yr & 20yr TBA & Spec,"10,000",8/13/2019,
,7/30/2019,7/31/2019,"100",FH/FN 30yr & 20yr TBA & Spec,"10,000,000",8/13/2019,
,7/30/2019,7/31/2019,"Jack, Mary, and Jane",8/1/2019,"123,456,789,012,345,678","10,000",8/13/2019,
$ awk -F\" '{
> OFS="\"";
> for ( i = 1; i <= NF; i++ ) {
> if ( i % 2 == 0 ) {
> gsub(/,/, "", $i)
> }
> }
> }1' input.csv
,7/30/2019,7/31/2019,Wed,8/1/2019,FH/FN 30yr & 20yr TBA & Spec,"10000",8/13/2019,
,7/30/2019,7/31/2019,"100",FH/FN 30yr & 20yr TBA & Spec,"10000000",8/13/2019,
,7/30/2019,7/31/2019,"Jack Mary and Jane",8/1/2019,"123456789012345678","10000",8/13/2019,
ПРИМЕЧАНИЕ:Это удалит запятые в полях, которые не являются числами. Чтобы правильно прочитать этот файл как csv, вам нужно это сделать. Если по какой-то причине вы хотите сохранить эти запятые, вы можете использовать приведенное ниже решение.
awk -F\" '{
OFS="\"";
for ( i = 1; i <= NF; i++ ) {
if ( i % 2 == 0 && $i ~ /[0-9]/ ) {
gsub(/,/, "", $i)
}
}
}1' input.csv
Предположим, что вы хотите запустить RunFeed.sh
со строкой подсистемы _edw
, соответствующей любому файлу DailyLoad_*.txt
, существующему в текущем каталоге, в качестве аргумента.
Чтобы проверить существование имени, используйте тест -e
. Чтобы сделать это над набором значений, используйте цикл.
#!/bin/bash
for string in account credit cust; do
if [ -e "DailyLoad_${string^}.txt" ]; then
sh RunFeed.sh "${string}_edw"
fi
done
Здесь происходит перебор трех строк account
, credit
и cust
. Для каждой из этих строк в $string
мы проверяем, существует ли имя DailyLoad_${string^}.txt
или нет, где ${string^}
соответствует -регистру первого символа строки в $string
.
Если имя существует, мы запускаем сценарий оболочки RunFeed.sh
с ${string}_edw
в качестве единственного аргумента.
Если вы хотите проверить не только существование, но и то, является ли файл не -пустым, используйте -s
вместо -e
в приведенном выше тесте. Тест -s
не пройден для файлов нулевой длины.
В вашем коде есть несколько основных синтаксических ошибок.
Присвоение переменных с префиксом $
. Это синтаксически допустимый код оболочки -при некоторых запутанных обстоятельствах, но не делает то, что вы ожидаете. В общем, присваивания должны выполняться именам переменных (variable=value
), а не расширению переменных ().$variable=value
В подстановке команд вокруг find
и wc
отсутствует завершающая обратная кавычка.
Вы используетеl
(ell ), а не1
(один )с опцией -maxdepth
для find
.
В операторе if
отсутствует fi
, а в конце цикла for
отсутствует done
.
У вас есть неиспользуемые переменные, и вы используете другие, которым никогда не присваивались значения.
Вы не цитируете некоторые расширения, которые требуют двойных -кавычек.
Веб-сайтhttps://www.shellcheck.net/может оказаться удобным для устранения синтаксических ошибок в коде оболочки -.