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

Мне нужно, чтобы 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 

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

  • Как определить интерпретатор команд из сценария оболочки?
  • Объектно-ориентированная оболочка для * nix
  • Сценарий Bash: команда test -o
  • Вывод переменной скрипта Bash
  • Как создать zip-каталогов -mtime -150
  • Извлечение вложенных zip-файлов
  • Автоматическая команда запуска при копировании файлов в каталог
  • Как неинвазивно проверить доступ на запись к файлу?
  • 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

    Можно ли экспортировать переменную env через Upstart?

    ftp и shebang

    yum Ошибка: нет модуля с именем site

    Как узнать, подключен ли процесс к интерфейсу крана?

    Как добавить открытый ключ к изображению QCOW2 через virt-sysprep

    Вход SSH на удаленный компьютер с другого удаленного компьютера. Как управлять соединениями?

    sqoop2 не запускается

    Ограничить доступ ssh от LDAP к пользователям, у которых есть / домашний каталог

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

    Где программы пользовательского пространства должны сохранять свои журналы?

    eth0 r8169 вниз после пробуждения из режима ожидания

    Почему GRUB загружает 32-битные файлы Debian вместо 64-бит Ubuntu в моей конфигурации с несколькими загрузками?

    как предотвратить изменение пользователем прав доступа к домашнему каталогу?

    Отключить обнаружение разъема для наушников в пульсовом

    добавление текста в имя файла перед расширением

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