Как добавить заголовки в CSV-файл, в котором уже есть несколько заголовков

Мое требование - добавить новые заголовки в существующий файл CSV, в первой строке которого уже есть несколько заголовков. Мне нужно добавить новые заголовки в конце существующих заголовков. Значение новых заголовков будет пустым; Мне просто нужно создать заголовок.

Например, ниже мой CSV-файл

Cust_Name,Cust_ADD
A1,CBD
A2,CBE
A3,CBE

Мне нужно добавить заголовки «зарплата, возраст» в конце файла CSV.

Я попробовал этот код

sed -i "1s|\$|,$new_headers|" input.csv

Это дает мне результат, как показано ниже

Cust_Name,Cust_ADD
,Salary,age
A1,CBD
A2,CBE
A3,CBE

Новые заголовки появляются во второй строке.

Ожидаемый результат

Cust_Name,Cust_ADD,salary,age
A1,CBD,,
A2,CBE,,
A3,CBE,,

Что означает declare -p new_headers выходные данные; точнее, у тебя есть \n в конце?

Fravadona 22.07.2024 18:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
106
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

С любым awk

% awk '{NR == 1 ? $0=$0",salary,age" : $0=$0",,"}1' file.csv
Cust_Name,Cust_ADD,salary,age
A1,CBD,,
A2,CBE,,
A3,CBE,,

Данные

% cat file.csv
Cust_Name,Cust_ADD
A1,CBD
A2,CBE
A3,CBE

Я все еще получаю новые заголовки во второй строке awk '{NR == 1 ? $0=$0",salary,age" : $0=$0",,"}1' input.csv > input.csv

Loganayaki mahalingam 22.07.2024 18:29

Не следует перенаправляться на тот же файл. Используйте временный файл, например. awk '{NR == 1 ? $0=$0",salary,age" : $0=$0",,"}1' input.csv > input_mod.csv && mv input_mod.csv input.csv

Andre Wildberg 22.07.2024 18:36

Я попробовал это awk '{NR == 1 ? $0=$0",salary,age" : $0=$0",,"}1' input.csv > temp.csv && mv temp.csv input.csv новые заголовки идут во второй строке

Loganayaki mahalingam 22.07.2024 18:55

Вы пробовали это с опубликованными данными? Там это работает? Как выглядит input.csv? Есть ли новая строка Windows в конце первой строки? См., например. stackoverflow.com/questions/19406418/…

Andre Wildberg 22.07.2024 19:01

это правильно, в конце первой строки появилась новая строка после ее удаления с помощью sed -i '1s/\r$//' input.csv. Я могу создать заголовки в первой строке, но в ней создана пустая строка конец каждой строки

Loganayaki mahalingam 22.07.2024 19:11

Если в результате есть дополнительные данные, они, вероятно, уже присутствуют в исходном файле input.csv. Включите отображение пробелов или что-то подобное в вашем любимом редакторе и проверьте файл.

Andre Wildberg 22.07.2024 19:18

можно исправить это, используя awk 'NR == 1 { $0 = $0 ",Salary,age"}1' input.csv > temp.csv && mv temp.csv input.csv

Loganayaki mahalingam 22.07.2024 19:44
Ответ принят как подходящий

Это может сработать для вас (GNU sed):

sed -i '1s/$/,salary,age/;1!s//,,/' file

В первой строке добавьте ,salary,age.

Во всех остальных строках добавьте ,,.

Н.Б. Вторая команда замены, поскольку она пуста, использует предыдущее регулярное выражение, но предоставляет новое значение для добавления, то есть s//,,/.

У вас могут быть окончания строк DOS, см. Почему выходные данные моего инструмента перезаписывают себя и как это исправить?.

Как только это будет исправлено, если необходимо, используйте любой awk:

$ awk '{print $0 (NR>1 ? ",," : ",salary,age")}' file
Cust_Name,Cust_ADD,salary,age
A1,CBD,,
A2,CBE,,
A3,CBE,,

Дополнительную информацию о работе с CSV с помощью awk см. в разделе Какой самый надежный способ эффективного анализа CSV с помощью awk?.

Да, первое знакомство с dos2unix и unix2dos всегда будет хорошим советом. Хороший улов.

David C. Rankin 23.07.2024 02:48

Я бы использовал GNU AWK для этой задачи следующим образом: пусть file.csv контент будет

Cust_Name,Cust_ADD
A1,CBD
A2,CBE
A3,CBE

затем

awk -v headers = "salary,age" 'BEGIN{FS=OFS = ","}NR==1{$0=$0 "," headers;fnum=NF}{NF=fnum;print}' file.csv

дает результат

Cust_Name,Cust_ADD,salary,age
A1,CBD,,
A2,CBE,,
A3,CBE,,

Объяснение: я ввожу headers с помощью переключателя -v (поэтому, если у вас есть заголовки в переменной оболочки с именем headers, вы можете сделать headers = "$headers") и сообщаю GNU AWK, что запятая является одновременно разделителем полей (FS) и разделителем выходных полей (OFS), в 1-й строке я добавляю запятую и заголовки в строку и сохраните количество полей (NF) в переменной fnum. Для каждой переменной я установил количество полей равным fnum, чтобы GNU AWK добавил подходящее количество пустых полей и print строку.

(проверено в GNU Awk 5.1.0)

Установка new_headers=salary,age и запуск команды sed для предоставленных вами входных данных не приводит к предоставленному вами выводу. Таким образом, почти наверняка проблема со странным расположением новой строки возникает из-за чего-то, чего вы не показали.

Проверьте содержимое входного файла и переменной. Используйте что-то, что позволит вам видеть всех персонажей. Например:

sed -n "=;l;s|\$|,$new_headers|;l;q" input.csv
  • = - вывести номер строки
  • l — распечатать исходную строку в «визуально однозначном» виде
  • s/// - выполнить замену
  • l — вывести измененную строку в «визуально однозначном» виде
  • q — выйти (чтобы доказать, что обрабатывается только первая строка)

Другие вопросы по теме

Похожие вопросы

Сообщение об ошибке bash, по-видимому, исходит из среды, а не из самого bash при выполнении внутри функции
Как я могу выполнить произвольный код с помощью командной кнопки appShell (вместо отображения представления)?
В чем разница между использованием ; и && в сценариях package.json?
Как удалить все файлы, кроме файлов последнего дня в Linux?
Bash: чтение строки из файла с подстановкой переменных
Bash: как продолжить цикл, если условие X выполнено
Gawk зависает при использовании регулярного выражения для RS в сочетании с чтением непрерывного потока со стандартного ввода
Как написать выражение REGEXP_EXTRACT в конфигурации Google Cloud Logging json?
Powershell Невозможно найти диск. Диск с именем «C» не существует
Как передать интерактивную оболочку удаленной программы в стандартный вывод работающей программы на C++, которая запустила удаленную программу (с использованием BSUB -I)