Управление файлом CSV: увеличение координат/позиции ячейки

У меня есть файл csv с одной записью в каждой строке, три записи образуют целый набор данных. Итак, что мне нужно сделать сейчас, это поместить эти наборы в столбцы в одну строку. Мне сложно описать проблему (поэтому мой поиск не дал мне решения), поэтому вот пример.
Пример CSV-файла:

1  Joe  
2  Doe  
3  7/7/1990  
4  Jane  
5  Done  
6  6/6/2000  

Что я хочу в конце концов, так это:

1  Name  Surname  Birthdate  
2  Joe   Doe      7/7/1990  
3  Jane  Done     6/6/2000  

Я пытаюсь найти решение, чтобы сделать это автоматически, поскольку мой фактический файл состоит из 480 наборов данных, каждый набор содержит 16 записей, и мне потребовались бы дни, чтобы сделать это вручную.

Мне удалось заполнить первую строку косвенной функцией Excel:

=INDIRECT("A"&COLUMN()-COLUMN($A1))

Поскольку COLUMN возвращает номер столбца, если я перетащу первую строку вниз в Excel, очевидно, это покажет то же самое, что и первая строка:

1  Name  Surname  Birthdate  
2  Joe   Doe      7/7/1990  
3  Joe   Doe      7/7/1990  

Теперь я ищу способ увеличить позицию ячейки на единицу:

   A           B      C       D
1 Joe        =A1   =B1+1   =C1+1
2 Doe        =D1+1
3 7/7/1990
4 Jane  

К чему должно привести:

   A           B    C     D  
1 Joe        =A1   =A2   =A3  
2 Doe        =A4   =A5   =A4  
3 7/7/1990  
4 Jane  

Как вы можете видеть в приведенном примере, координаты ячейки для A увеличиваются на единицу, и я понятия не имею, как это сделать автоматически в Excel. Я думаю, что должен быть лучший способ, чем использование вложенной функции Excel, поскольку задача (приращение +1) кажется на самом деле довольно простой.
Я также открыт для решений, использующих sed, awk (о которых у меня есть знания) или другие инструменты командной строки.
Мы очень ценим вашу помощь!


person macmaniac    schedule 15.02.2019    source источник


Ответы (1)


 awk 'BEGIN { y=1; printf "Name Surname Birthdate\n%s",y; x=1;}
  {if (x == 3) {
   y = y + 1;
   printf "%s\n%s",$2,y;
   x=1;
  }
  else {
   printf " %s ",$2;
   x = x + 1;
  }}' input_file.txt

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

Этот второй фрагмент кода предоставит вывод с разделителем-запятой. Опять же, предполагается, что в вашем образце входного файла не было запятых для разделения 1 Joe и 2 Doe.

awk 'BEGIN { y=1; printf "Name Surname Birthdate\n%s",y; x=1;}
 {if (x == 3) {
  y = y + 1;
  printf "%s\n%s,",$2,y;
  x=1;
 }
  else {
  printf " %s,",$2;
  x = x + 1;
 }}' input_file.txt

Оба awk-скрипта установят переменные x и y в единицу, где переменная y будет увеличивать нумерацию строк. Переменная x будет считать до 3, а затем вернется к единице. Это делается для того, чтобы он печатал каждую строку подряд, пока не дойдет до 3-го элемента, где затем будет вставлен символ новой строки.

Есть более простые/сложные способы сделать это с помощью регулярных выражений и такого языка, как perl, но, поскольку вы упомянули awk, я считаю, что это будет работать нормально.

person Ribtips    schedule 16.02.2019
comment
Спасибо за скрипт, но он не такой тихий, как я ожидал. Он помещает имя, фамилию, дату рождения в первую строку, 1 во вторую строку, 2 в третью строку и 3 в четвертую строку. Второй фрагмент кода помещает 1 , , на вторую строку, 2 , , , на третью строку и 3 на четвертую строку. Есть идея? - person macmaniac; 22.02.2019
comment
В ваших фрагментах файлов я не видел никаких реальных разделителей запятых, но это просто пробелы. Если в ваших файлах есть фактические разделители-запятые, то в самом начале оператора awk вы можете добавить флаг -F, который указывает сценарию использовать запятые в качестве разделителей. Это может объяснить, почему вы видите то, что видите. Так что попробуйте с awk -F, '{НАЧАТЬ... и посмотрите, поможет ли это... - person Ribtips; 23.02.2019
comment
Спасибо за помощь - мне не удалось заставить скрипт работать так, как хотелось бы, даже с -F. Но, как следствие, чтобы напечатать значение z в строке 1, какой должна быть команда? После этого я оставлю вас в покое и изучу awk с начала :-) - person macmaniac; 11.03.2019