Уменьшить длину определенного столбца в текстовом файле с разделителями

Мне нужно, чтобы 5-й столбец в текстовом файле с разделителями сокращался до первых 5 символов. Все остальные столбцы должны оставаться неотредактированными.

Входные данные:

file1.txt column1 column2 column3 column4 column5 123456789 123456789 123456789 123456789 123456789 

Я хотел бы, чтобы результат выглядел так:

 output.txt column1 column2 column3 column4 column5 123456789 123456789 123456789 123456789 12345 

Примечание. Я использую запятые в качестве разделителя.

  • избегать множественных труб, поврежденных из-за отсутствия команды
  • Прерывание цикла Bash для цикла
  • Заменить общие значения в двух файлах в соответствии с первым столбцом
  • Bash: добавить столбцы в таблицу
  • Получите полные размеры окна (включая украшения) в Unity
  • Сравнение файлов и их свойств
  • проблема сценария оболочки с использованием операторов
  • Какие команды Unix можно использовать в качестве семафора / блокировки?
  • 3 Solutions collect form web for “Уменьшить длину определенного столбца в текстовом файле с разделителями”

    Если file.csv выглядит так:
    123456789,123456789,123456789,123456789,123456789 123456789,123456789,123456789,123456789,223456789 123456789,123456789,123456789,123456789,323456789 123456789,123456789,123456789,123456789,423456789

    awk -F, '{print $1","$2","$3","$4","substr($5,1,5) }' file.csv
    выведет это:
    123456789,123456789,123456789,123456789,12345 123456789,123456789,123456789,123456789,22345 123456789,123456789,123456789,123456789,32345 123456789,123456789,123456789,123456789,42345

    Если все значения просты (без кавычек и символов новой строки в значении), и если они разделены запятой, например:

     123456789,123456789,123456789,123456789,123456789 

    и если в строке всегда есть 5 таких значений, вы можете использовать sed :

     sed '2,$s/\(.*\),\(.*\),\(.*\),\(.*\),\(.....\)\(.*\)/\1,\2,\3,\4,\5/' input 

    2,$ предполагает, что вы также разделяете запятую (и чтобы ее пятый столбец не был усечен), если это не так, оставьте это.

    Или awk :

    Для белого пробела:

     awk 'NR==1 { print; next} {print $1, $2, $3, $4, substr($5,1,5)}' 

    Для запятой:

     awk 'BEGIN {FS=","} NR==1 { print; next} {print $1, $2, $3, $4, substr($5,1,5)}' 

    Для немного лучшего разделения CSV и предположения GNU awk:

     awk -vFPAT='[^,]*|"[^"]*"' 'NR==1 { print; next} {print $1, $2, $3, $4, substr($5,1,5)}' 
    Interesting Posts

    Есть ли более простой способ найти свободное место на диске в скрипте, чем «df»?

    Перебирать ассоциативные массивы подстрокой

    Что представляет m в столбце VIRT, используя команду TOP

    извлечь количество байтов из файла

    Загадочная 8-секундная задержка загрузки после grub

    Как постепенно удалить файл параллельно с шифрованием?

    Создание мультисессионного ISO-образа для записи на удаленном компакт-диске

    Использует ли элементарная ОС стандартные AppIndicators?

    Создание команд с переменным расширением в цикле

    Как я могу извлечь определенную строку из файла?

    Установка Zend на Fedora 19

    Выберите строки в одном файле на основе определенных значений во втором файле

    Введите символы из фонетических символов с клавиатуры

    VMWare Workstation Общие папки на ядре Arch / Linux 4.x все еще не работают?

    postfix / smtpd: предупреждение: подключиться к службе Milter unix: /var/run/opendkim/opendkim.sock: нет такого файла или каталога

    Linux и Unix - лучшая ОС в мире.