2009-08-04 2 views
8

У меня есть файл с именем ip-list с двумя столбцами:Элегантный способ изменить порядок столбцов

IP1 <TAB> Server1 
IP2 <TAB> Server2 

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

Server1 <TAB> IP1 
Server2 <TAB> IP2 

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

+0

Какая платформа? Windows, Unix, Макс. , , –

+0

Добавлен «Linux». Благодарю. –

ответ

12

Использование AWK:

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

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

+2

Стоит отметить, что он дает результат как ограниченный пробел, но довольно сложно вставить вкладку, если она вам нужна. –

3

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

 
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 
+0

Где идет имя файла? –

0

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

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

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

Смежные вопросы