как изменить один столбец и добавить другие столбцы в строке awk

У меня есть файл MDD.TXT со следующими записями. файл: MDD.TXT

0|ABC|055309|20120929053309|11965150 0|ABC|061434|20120929063434|11155537 0|ABC|070228|20120929073228|11965150 0|ABC|082213|20120929583213|11965150 0|ABC|083950|20120929983950|11965150 0|ABC|084112|20120929083112|11965150 

Теперь я хочу заменить второй столбец на «XYZ» и хочу добавить два имени файла столбца и «успех» во всей записи. желаемый результат должен быть следующим:

 0|XYZ|055309|20120929053309|11965150|MDD.TXT|SUCCESS 0|XYZ|061434|20120929063434|11155537|MDD.TXT|SUCCESS 0|XYZ|070228|20120929073228|11965150|MDD.TXT|SUCCESS 0|XYZ|082213|20120929583213|11965150|MDD.TXT|SUCCESS 0|XYZ|083950|20120929983950|11965150|MDD.TXT|SUCCESS 0|XYZ|084112|20120929083112|11965150|MDD.TXT|SUCCESS 

  • Подавлять предупреждения от MySQL в сценарии оболочки, но допускать ошибки
  • скрипт, выполняющийся в crontab, не выдающий вывод на экран оболочки
  • команда bash / script для сброса маршрута по умолчанию
  • Прерывание цикла Bash для цикла
  • перечислить файлы и сохранить их в переменных
  • Сортировка файлов в соответствии с их расширениями
  • Слияние двух файлов после проверки соответствия некоторых столбцов
  • Как разбирать несколько шаблонов строк в скрипте linux shell
  • 5 Solutions collect form web for “как изменить один столбец и добавить другие столбцы в строке awk”

    Вы можете попробовать следующее awk :

     awk 'BEGIN { FS = OFS = "|" } { $2 = "XYZ"; $6 = ARGV[1]; $7 = "SUCCESS";} 1' MDD.TXT 

    или:

     awk 'BEGIN { FS = OFS = "|" } { $2 = "XYZ"; print $0 OFS ARGV[1] OFS "SUCCESS"; }' MDD.TXT 

    Вы также можете использовать sed

     $ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT 

    Чтобы внести изменения в файл напрямую

     $ sed -i -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT 

    Чтобы сохранить исходный файл и перенаправить желаемый вывод на другой

     $ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT >> MDD_MODIFFIED.TXT 

    С awk :

     awk 'BEGIN{OFS=FS="|"} {$2="XYZ"; $0=$0"|"FILENAME"|SUCCESS"}1' mdd.txt 

    Где:

    • BEGIN{} выполняется только в начале, а не для каждой строки.
    • OFS=FS="|" устанавливает разделитель поля ввода и вывода в | ,
    • $2="XYZ" устанавливает второе поле в XYZ
    • $0=... добавляет к целой строке FILENAME (из внутренних переменных awk ) и SUCCESS в виде строки.

    Это та же идея, что и существующие awk но немного более кратким:

     awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,"MDD.TXT","SUCCESS"}' MDD.TXT 

    Чтобы он автоматически добавлял имя файла (для любого имени файла), используйте:

     awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,ARGV[1],"SUCCESS"}' MDD.TXT 

    -F устанавливает разделитель входных записей, а -vOFS устанавливает переменную OFS , разделитель выходной записи. Затем мы устанавливаем второе поле в XYZ и печатаем строку ( $0 ), имя файла ( ARGV[1] ) и SUCCESS .

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

     $ awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,ARGV[1],"SUCCESS"}' MDD.TXT 0|XYZ|055309|20120929053309|11965150 |MDD.TXT|SUCCESS 0|XYZ|061434|20120929063434|11155537 |MDD.TXT|SUCCESS 0|XYZ|070228|20120929073228|11965150 |MDD.TXT|SUCCESS 0|XYZ|082213|20120929583213|11965150 |MDD.TXT|SUCCESS 0|XYZ|083950|20120929983950|11965150 |MDD.TXT|SUCCESS 0|XYZ|084112|20120929083112|11965150|MDD.TXT|SUCCESS 

    Чтобы этого избежать, вы можете установить разделитель полей ввода в | или пространство:

     $ awk -F' |' -vOFS="|" '{$2="XYZ"; print $0,ARGV[1],"SUCCESS"}' MDD.TXT 0|ABC|055309|20120929053309|11965150|XYZ

    MDD.TXT|SUCCESS 0|ABC|061434|20120929063434|11155537|XYZ||MDD.TXT|SUCCESS 0|ABC|070228|20120929073228|11965150|XYZ||MDD.TXT|SUCCESS 0|ABC|082213|20120929583213|11965150|XYZ||MDD.TXT|SUCCESS 0|ABC|083950|20120929983950|11965150|XYZ||MDD.TXT|SUCCESS 0|ABC|084112|20120929083112|11965150|XYZ|MDD.TXT|SUCCESS

    Или вы можете просто удалить конечные пробелы перед разбором файла:

     sed 's/\s*$//' MDD.TXT | awk -F' |' -vOFS="|" '{$2="XYZ"; print $0,"MDD.TXT|SUCCESS"}' 
    Linux и Unix - лучшая ОС в мире.