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

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

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

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

  • Выход grep cdrecord
  • обновить json-файл
  • Есть ли разница между read, head -1 и sed 1q?
  • Решение регулярного выражения grep (жадно не работает)
  • Как я могу выполнить двоичный поиск текстового файла для определенной строки символов?
  • Сценарий оболочки для фильтрации даты отдельно от конкретного столбца файла .csv и сохранения вывода в другом файле csv
  •  10,15,11,21 9,11,17,19 7,11,24,18 ... 

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

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

  • Как найти файл с использованием нескольких шаблонов
  • Как запустить grep и показать x количество строк до и после матча
  • замените несколько запятых на одну или несколько наборов фигурных скобок и исключение, что в одном или нескольких наборах фигурных скобок
  • Как разбить текстовый файл на новые файлы
  • Как я могу grep две вещи, где есть опция -w?
  • Как вставить текст после определенной строки в файл?
  • 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 - лучшая ОС в мире.