Добавление столбцов в текстовый файл после последней строки
Меньшая версия многих файлов данных, которые у меня есть, выглядит следующим образом:
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 и выше из моего исходного файла.
- Как разбирать JSON с помощью сценариев оболочки в Linux?
- Как заменить пустые ячейки определенного столбца
- помогите понять формулу awk, которая разворачивает файлы fasta
- Выберите конкретный диапазон полей текстового файла
- Как сгруппировать группу строк на основе информации из первой строки?
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 и т. Д.
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