Как изменить порядок столбцов файла в Linux из командной строки - PullRequest
11 голосов
/ 04 августа 2009

У меня есть файл с именем ip-list с двумя столбцами:

IP1  <TAB>  Server1
IP2  <TAB>  Server2

И я хочу произвести:

Server1  <TAB>  IP1
Server2  <TAB>  IP2

Какой самый элегантный и самый короткий инструмент командной строки Linux для этого?

Ответы [ 4 ]

14 голосов
/ 04 августа 2009

Использовать awk:

awk '{print $2,$1}' ip-list

Это должно дать вам то, что вы хотите.

4 голосов
/ 04 августа 2009

Самое простое решение:

awk '{print $2 "\t" $1}'

Однако есть некоторые проблемы. Если в любом из полей могут быть пробелы, вам нужно выполнить одно из: (в зависимости от того, поддерживает ли ваш awk -v)

awk -v FS='\t' '{print $2 "\t" $1}'
awk 'BEGIN{ FS="\t" } {print $2 "\t" $1}'

Кроме того, вы можете сделать одно из:

awk -v OFS='\t' '{print $2,$1}'
awk 'BEGIN{ OFS="\t" } {print $2,$1}'
awk -v FS='\t' -v OFS='\t' '{print $2,$1}' # if allowing spaces in fields

Один из комментариев спрашивает: «Куда идет имя файла»? В качестве фильтра используется awk, поэтому обычно он выглядит так:

$ some-cmd | awk ... | other-cmd

без указания имени файла. Или имя файла может быть задано в качестве аргумента после всех команд:

$ awk ... filename
3 голосов

Более двух столбцов

printf '1 2 3 4\n5 6 7 8\n' | awk '{for(i=NF;i>0;i--)printf "%s ",$i;print ""}'

Выход:

4 3 2 1
8 7 6 5

Смотри также: https://unix.stackexchange.com/questions/46275/swapping-an-unlimited-number-of-columns

Протестировано в GNU Awk 4.0.1.

0 голосов
/ 04 августа 2009

perl -pi -e 's/^([^\t]+)\t([^\t]+)$/\2\t\1/' yourfile.csv

perl -pi -e 'split("\t"); print "$_[1]\t$_[0]"'

Первый, вероятно, работает и на sed.

...