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

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

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 и т. Д.

  • Извлечь линии между двумя шаблонами
  • Изменение имени сервера в файле OpenVPN с помощью sed
  • как сравнивать значения в двух столбцах в двух разных файлах, повторяя полные строки, где абсолютное значение разности <малое максимальное значение?
  • Почему вывод этой команды вставки разделяется на отдельные строки с помощью отступов?
  • Как использовать соответствующее регулярное выражение для поиска шаблона в awk?
  • Печать строк с нечетными номерами, печать строк с четными номерами
  • Отправка сигналов на длительные процессы (AWK, DD)
  • grep все строки, начинающиеся с определенного символа, и заканчиваются другим символом
  • 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 
    Linux и Unix - лучшая ОС в мире.