Unix - заменить значение столбца внутри цикла while - PullRequest
0 голосов
/ 25 сентября 2018

У меня текстовый файл, разделенный запятыми (иногда табуляция), как показано ниже:

parameters.txt:

STD,ORDER,ORDER_START.xml,/DML/SOL,Y
STD,INSTALL_BASE,INSTALL_START.xml,/DML/IB,Y

с кодом ниже, который я пытаюсьперебрать файл и сделать что-то

while read line; do
if [[ $1 =  "$(echo "$line" | cut -f 1)" ]] && [[ "$(echo "$line" | cut -f 5)" = "Y"  ]] ; then
//do something...
if [[ $? -eq 0 ]] ; then
// code to replace the final flag
fi
fi
done < <text_file_path>

Я хотел бы обновить последний столбец файла до N, если вышеуказанная операция прошла успешно, однако приведенные ниже подходы не работают для меня:

  1. sed 's/$f5/N/'
  2. '$5=="Y",$5=N;{print}'
  3. $(echo "$line" | awk '$5=N')

Обновление: несколько соображений, которые необходимо учитывать для большей ясности, которые явначале пропустил, извинения!

  1. Файл параметров может содержать строки с последним флагом поля также как "N".
  2. Окончательный флаг необходимо обновлять, только если "// doчто-то "код успешно выполнен.
  3. После циклического прохождения всех строк, т. е. после выхода из флагов" while loop "для всех строк будет установлено значение" Y "

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Заменить ,N в конце строки ($) на ,Y:

sed 's/,N$/,Y/' file
0 голосов
/ 25 сентября 2018

с bash:

(
IFS=,
while read -ra fields; do
    if [[ ${fields[0]} == "$1" ]] && [[ ${fields[4]} == "Y" ]]; then
        # do something
        fields[4]="N"
    fi
    echo "${fields[*]}"
done < file | sponge file
)

Я запускаю это в подоболочке, чтобы эффекты изменения IFS были локализованы.

При этом используется sponge для обратной записи в тот же файл.Вам нужен пакет moreutils, чтобы использовать его, в противном случае используйте

done < file > tmp && mv tmp file

Возможно, немного проще, менее специфично для bash

while IFS= read -r line; do
    case $line in 
        "$1",*,Y) 
            # do something
            line="${line%Y}N"
            ;; 
    esac
    echo "$line"
done < file
0 голосов
/ 25 сентября 2018

возможно инвертировать операции, выполняющие обработку в awk.

$ awk -v f1="$1" 'BEGIN             {FS=OFS=","}
                  f1==$1 && $5=="Y" { // do something
                                      $5="N"}1'  file

Не уверен, что такое операция "сделать что-то", если вам нужно вызвать другую команду / скрипт, это также возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...