«Голова» печатает только одну строку?

У меня есть CSV-файл, который генерируется путем сохранения в CSV из Excel. Если я делаю «голова» (или действительно «grep» или что-то еще), он печатает только первую строку:

head -n 10 messy.csv 10,15,11,21 

Но если я открываю файл в текстовом редакторе или в Excel, он имеет много строк в нем:

 10,15,11,21 9,11,17,19 7,11,24,18 ... 

head прекрасно работает на других файлах на машине.

Почему это? (Я подозреваю, что это связано с окончанием строки, но я не знаю, что.) И как я могу это исправить?

  • Почему `cat`ing файл в себя стирает его?
  • Использовать вывод из головы для копирования файлов с пробелами
  • Как выполнить эту команду оболочки из Python?
  • Как получить строки от 10 до 100 из 200-строкового файла в новый файл
  • Как я могу напечатать вторую в последнюю строку множество файлов в один файл?
  • Только кошка из определенной строки X (с рисунком) в другую определенную строку Y (с рисунком)
  • Скопируйте определенный процент каждого файла в каталог в новый файл
  • почему моя первая операция с трубой не удаляла символ новой строки?
  • 4 Solutions collect form web for “«Голова» печатает только одну строку?”

    Я думаю, что это связано с окончанием строки. Excel сохранит файлы с окончанием возврата каретки / линии, но head будет ожидать только линии.

    Какой вывод показывает это: tr -d '\r' < messy.csv | head -10 tr -d '\r' < messy.csv | head -10

    Если он отображает 10 строк правильно, это ваш ответ.

    file может сообщить вам о завершении строки для определенных текстовых файлов (она будет печатать … с терминаторами строк CRLF ), но это не делает для всех текстовых файлов (я считаю, что это не так, если он распознает файл как нечто другое, например HTML).

    У вас есть \r только как символ конца строки для строк 2 (по крайней мере, до строки 10). Строка 1 имеет \n как символ конца строки. например.

     printf 'ABC\nXYZ\r123\r' | head 

    выход (на экран)

     ABC 

    Это артефакт отображения, связанный с выходом терминала. \r возвращается к началу строки, а следующая строка перезаписывает его, а последняя строка получает переписанную или частично – подсказкой терминала.

    Когда последняя строка с разделителем длиной \r превышает длину приглашения, эта строка частично отображается (за пределами строки запроса) – например, В следующем выпуске sampel запрос терминала равен nn $ (5 символов), где nn выдается n-я команда).

     72 $ printf 'ABC\nXYZ\rabcdefghijklmnop\r' ABC 73 $ fghijklmnop 

    Исправить это

     sed -i.bak 's/\r$//; s/\r/\n/g' file 

    Опция -i.bak заставляет входной file обновляться i nline и создает резервную копию file.bak . Если вам не нужна резервная копия, просто используйте -i .

    Анализ вашей проблемы

    head не ведет себя так, как вы ожидаете. Замените его простым инструментом анализа od чтобы узнать, что происходит:

     od -cx messy.csv 

    а затем посмотреть, как head справляется с этим файлом:

     head -2 messy.csv | od -cx 

    Вы заметите, что head имеет дело с возвратным кодом ASCII ( 0x0d ), поскольку он был задуман для:

    сделайте «возврат каретки» оригинального типа. Он просто возвращает текущую позицию курсора, готовую для следующей позиции, чтобы писать в «начале строки».

    Почини это

    См. Правильную команду sed здесь: исправить '\ r' из файла Excel

    Для записи

    Эта ошибка Microsoft является победной: эта кодировка конца строки Excel неверна для: Windows, Unix (все), MacOS X.

    Вы не можете превзойти его :).

    Я думаю, что правильный путь:

    head -10 file.txt (для печати 10 строк)

    Другой способ:

    cat file.txt | head -10

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