2016-10-16 4 views
0

Я пытаюсь изменить порядок столбцов, используя AWK, Sed ... но я не мог найти правильный ответ на этот вопрос, В принципе, я хочу, чтобы изменить порядок значений из:Упорядочивание столбцов с использованием AWK

time 012016 022016 032016 04216 

John 231 321 121 432 

Mary 456 213 654 735 

Charles 325 867 984 235 

чтобы:

time John Mary Charles 

012016 231 456 325 

022016 321 213 867 

032016 121 654 984 

042016 432 735 235 

Я пытался использовать что-то вроде, но я пропускаю номера:

awk '{print $1}' ./database.dat | paste -d, -s 

Выход:

time John Mary Charles 
+2

Пожалуйста, обратите внимание на: [Что я должен делать, когда кто-то ответит на мой вопрос?] (Http://stackoverflow.com/help/someone-answers) – Cyrus

+0

Также см. Http://www.thelinuxrain.com/articles/transposing-rows-and-columns-3-methods – user2138595

ответ

1
$ cat ip.txt 
time 012016 022016 032016 04216 
John 231 321 121 432 
Mary 456 213 654 735 
Charles 325 867 984 235 

Использование tr, wc и pr

$ tr ' ' '\n' < ip.txt | pr -$(wc -l < ip.txt)t 
time   John   Mary   Charles 
012016  231   456   325 
022016  321   213   867 
032016  121   654   984 
04216   432   735   235 


С perl, должен быть быстрее, чем tr, wc, pr затора

$ perl -lane '                          
push(@a, @F); 
END 
{ 
    $r = $.; $c = $#F + 1; 
    foreach $i (0..$#F) 
    { 
     print join "\t", @a[map {$i + $_*$c} 0..$r]; 
    } 
}' ip.txt 
time John Mary Charles 
012016 231 456 325 
022016 321 213 867 
032016 121 654 984 
04216 432 735 235 
  • Входная линия расщепляется о n пробелов, которые сохраняются в массиве @F. Этот массив объединяется для каждой строки в @a массив
  • После обработки всего файла $. будет иметь количество строк во входном файле.$#F дает индекс последнего элемента массива @F
  • Затем напечатать в требуемом формате
+0

«должно быть быстрее, чем ...» ... ну, за исключением времени загрузки; -> , Всем удачи. – shellter

1

Использование ghostdog74's awk script три раза, чтобы транспонировать файл:

#!/bin/bash 

transpose() { 
    awk ' 
    { 
    for (i=1; i<=NF; i++) { 
     a[NR,i] = $i 
    } 
    } 
    NF>p { p = NF } 
    END {  
    for(j=1; j<=p; j++) { 
     str=a[1,j] 
     for(i=2; i<=NR; i++){ 
     str=str" "a[i,j]; 
     } 
     print str 
    } 
    }' 
} 

transpose | transpose | transpose 

Использование: ./this_script.sh < filename

Выход:

 
time John Mary Charles 
012016 231 456 325 
022016 321 213 867 
032016 121 654 984 
04216 432 735 235 

Я предполагаю, что файл не содержит пустых строк ,


Или изменить скрипт ghostdog74 для вращения в другом направлении.

1

Надежда это то, что вы ищете:

AWK сценария

awk '{for(i=1;i<=NF;i++){val[NR][i]=$i}} 
    NR==FNR{fc=NF} 
    END{for(i=1;i<=fc;i++){ 
    for(rec=1;rec<=FNR;rec++){printf "%s%s",val[rec][i],(rec<FNR)?"\t":ORS} 
    }}' filename 

Выход

time  John Mary Charles 
012016  231  456  325 
022016  321  213  867 
032016  121  654  984 
04216  432  735  235 

Допущение: Каждая запись в файле имеет такое же количество полей

0

rs полезности из BSD (полученный в Ubuntu с помощью apt-get install rs).

$ rs -t 5 
time 012016 022016 032016 04216 

John 231 321 121 432 

Mary 456 213 654 735 

Charles 325 867 984 235 
[Ctrl-D][Enter] 
time  John  Mary  Charles 
012016 231  456  325 
022016 321  213  867 
032016 121  654  984 
04216 432  735  235 

Транспонирование с TxR Лиспе:

$ txr -e '(put-lines (mapcar (op cat-str @1 " ") (transpose (build (awk (f (add f)))))))' data 
time John Mary Charles 
012016 231 456 325 
022016 321 213 867 
032016 121 654 984 
04216 432 735 235