Добавление столбцов в текстовый файл после последней строки

Меньшая версия многих файлов данных, которые у меня есть, выглядит следующим образом:

0 0 0 0.05 9.6877884e-06 0.0024898597 0.1 4.2838688e-05 0.0049595502 0.15 0.00016929444 0.0074092494 0.2 0.00036426881 0.009839138 0.25 0.00055234582 0.012249394 0.3 0.00077448576 0.014640196 0.35 0.00082546537 0.017011717 0.4 0.0012371619 0.019364133 0.45 0.0013286382 0.02169761 

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

 0 0 0.05 9.6877884e-06 0.1 4.2838688e-05 0.15 0.00016929444 0.2 0.00036426881 0.25 0.00055234582 0.3 0.00077448576 0.35 0.00082546537 0.4 0.0012371619 0.45 0.0013286382 0 0 0.05 0.0024898597 0.1 0.0049595502 0.15 0.0074092494 0.2 0.009839138 0.25 0.012249394 0.3 0.014640196 0.35 0.017011717 0.4 0.019364133 0.45 0.021697611 

Я могу сгенерировать его с помощью awk '{print $1 " " $2}' data > tmp а затем awk '{print $1 " " $3}' data >> tmp но это очень утомительно для количества столбцов, которые у меня есть.

Есть ли более разумный способ добиться того, что мне нужно?

РЕДАКТИРОВАТЬ

Я хотел бы решение для произвольного числа столбцов, n. Правильный порядок столбцов для строк необходим для моих нужд. Таким образом, столбец 3 ввода должен быть «перемещен» под столбцом 2 входа, столбец 4 под 2 и 3 и т. Д., Причем столбец 1 укладывается под многократно. Первый столбец должен быть в порядке возрастания, так как количество строк в каждом столбце равно 0, 0.05, …, 0.45, 0, 0.05, …, 0.45, 0,0.05, …, 0.45 и т. Д.

  • Я хочу найти дубликаты в файле и добавить символ в конец строки в первом совпадении
  • Способ вставки определенного столбца, когда в терминале
  • как разбить строку после сопоставления определенного символа с помощью команды оболочки?
  • получить день с даты с добавлением 0 в 1 до 9 цифр
  • Чтобы получить вывод столбцов в отдельный файл
  • Как добавить текст в конец строки, содержащей несколько строк?
  • Замена первого номера файла на его половину
  • Сортировка нескольких файлов csv на основе двух столбцов в каталоге
  • 3 Solutions collect form web for “Добавление столбцов в текстовый файл после последней строки”

    Awk

    этот awk-скрипт будет работать на произвольном количестве столбцов> 2, и порядок появления будет сохранен так же, как и тогда, без предположений о том, что представляют собой столбцы ( т. е. не имеет значения, являются ли они числовыми или нет, отсортированы или нет, и т.д):

     { for (i = 2; i <= NF; i++) { a[j + i] = $1 " " $i } j += (i - 1); } END { OutNR = NR * NF; for (i = 2; i <= NF; i++) { for (j = 0; j < OutNR; j += NF) { print a[j + i]; } } } 

    Данный:

     0 0 0 0.2340 0.05 9.6877884e-06 0.0024898597 0.2341 0.1 4.2838688e-05 0.0049595502 0.2342 0.15 0.00016929444 0.0074092494 0.2343 0.2 0.00036426881 0.009839138 0.2344 0.25 0.00055234582 0.012249394 0.2345 0.3 0.00077448576 0.014640196 0.2346 0.35 0.00082546537 0.017011717 0.2347 0.4 0.0012371619 0.019364133 0.2348 0.45 0.0013286382 0.02169761 0.2349 

    Закажите по столбцу (2 .. n ), затем по строке:

     0 0 0.05 9.6877884e-06 0.1 4.2838688e-05 0.15 0.00016929444 0.2 0.00036426881 0.25 0.00055234582 0.3 0.00077448576 0.35 0.00082546537 0.4 0.0012371619 0.45 0.0013286382 0 0 0.05 0.0024898597 0.1 0.0049595502 0.15 0.0074092494 0.2 0.009839138 0.25 0.012249394 0.3 0.014640196 0.35 0.017011717 0.4 0.019364133 0.45 0.02169761 0 0.2340 0.05 0.2341 0.1 0.2342 0.15 0.2343 0.2 0.2344 0.25 0.2345 0.3 0.2346 0.35 0.2347 0.4 0.2348 0.45 0.2349 

    р

    Хотя большинство людей не думают о R для обработки текста, в этом случае это на самом деле немного более прямолинейно, хотя вся настройка параметров делает его более сложным, чем есть на самом деле. Суть этого решения состоит в том, чтобы просто rbind() несколько cbind() :

     d.in <- read.table(file = commandArgs(trailingOnly = T)[1] , colClasses = "character"); d.out<-data.frame(); for (i in 2:length(d.in)) { d.out <- rbind(d.out, cbind(d.in[,1], d.in[,i])); } write.table(d.out, row.names = F, col.names = F, quote = F); 

    Тогда просто:

     $ Rscript script.R data.txt 0 0 0.05 9.6877884e-06 0.1 4.2838688e-05 0.15 0.00016929444 0.2 0.00036426881 0.25 0.00055234582 0.3 0.00077448576 0.35 0.00082546537 0.4 0.0012371619 0.45 0.0013286382 0 0 0.05 0.0024898597 0.1 0.0049595502 0.15 0.0074092494 0.2 0.009839138 0.25 0.012249394 0.3 0.014640196 0.35 0.017011717 0.4 0.019364133 0.45 0.02169761 0 0.2340 0.05 0.2341 0.1 0.2342 0.15 0.2343 0.2 0.2344 0.25 0.2345 0.3 0.2346 0.35 0.2347 0.4 0.2348 0.45 0.2349 

    если заказ не имеет значения, вы можете просто использовать это:

     awk '{for(i=2;i<=NF;i++)print $1,$i}' file 

    Вот решение awk :

     $ awk '{a[i++]=$1" "$3;print $1,$2}END{for(i=0;i<length(a);i++){print a[i]}}' file 0 0 0.05 9.6877884e-06 0.1 4.2838688e-05 0.15 0.00016929444 0.2 0.00036426881 0.25 0.00055234582 0.3 0.00077448576 0.35 0.00082546537 0.4 0.0012371619 0.45 0.0013286382 0 0 0.05 0.0024898597 0.1 0.0049595502 0.15 0.0074092494 0.2 0.009839138 0.25 0.012249394 0.3 0.014640196 0.35 0.017011717 0.4 0.019364133 0.45 0.02169761 

    объяснение

    • При обработке файла мы сохраняем $ 1 и $ 3 для массива с индексом от 0 до количества строк с каждой строкой. Затем напечатайте $1 и $2 .

    • В конце мы прокручиваем массив a , печатаем каждый его элемент (который равен $1 $3 ). Порядок сохраняется, потому что мы снова зацикливаем с индексом от 0 до длины массива a .

    обновленный

    Для произвольных столбцов n я использую perl :

     $ perl -anle '$h{$i++} = [@F[0..$#F]]; END { for $j (1..$#F) { for (sort {$a<=>$b} keys %h) { print $h{$_}->[0]," ",$h{$_}->[$j] } } }' file 
    Interesting Posts
    Linux и Unix - лучшая ОС в мире.