Зациклить часть кода для нескольких переменных

Другое 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
-1
26.09.2021, 17:20
1 ответ

Предположим, что вы хотите запустить 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/может оказаться удобным для устранения синтаксических ошибок в коде оболочки -.

2
26.09.2021, 20:34

Теги

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