как изменить один столбец и добавить другие столбцы в строке 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 

  • Bash не может запустить команду из скрипта: команда mkdir не найдена
  • Как скопировать строки из нескольких файлов в один новый файл и сохранить имя файла?
  • Удалить все файлы в каталоге
  • Как извлечь неизвестные аргументы в сценарии оболочки?
  • cron script: dovecot: непризнанная услуга
  • Когда использовать #! / Bin / ksh и #! / Bin / sh? Нужен пример
  • В чем разница между «тестом» и оценкой с помощью / dev / null?
  • Как правильно уловить опциональные и необязательные аргументы?
  • 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 - лучшая ОС в мире.