Формирование порядка полей вывода из команды cut - PullRequest
30 голосов
/ 24 июня 2009

Я хочу сделать что-то вроде этого:

cat abcd.txt | cut -f 2,1 

и я хочу, чтобы в выводе был порядок 2, а затем 1. На машине, которую я тестирую (FreeBSD 6), этого не происходит (его печать в 1,2 порядке). Можете ли вы сказать мне, как это сделать?

Я знаю, что всегда могу написать сценарий оболочки для этого, но я ищу что-то, используя опции команды 'cut'.

Я думаю, что я использую coreutils версии 5.2.1, содержащую cut.

Ответы [ 2 ]

32 голосов
/ 24 июня 2009

Этого нельзя сделать с помощью cut. Согласно справочной странице:

Выбранный ввод записывается в том же порядке, в котором он читается, и написано ровно один раз.

Исправление cut было предложено предложено много раз , но даже полные исправления были отклонены .

Вместо этого вы можете сделать это, используя awk, например:

awk '{print($2,"\t",$1)}' abcd.txt

Замените \t тем, что вы используете в качестве разделителя полей.

14 голосов
/ 14 сентября 2012

Ответ Ларса был великолепен, но я нашел еще лучший. Проблема с его в том, что он соответствует \ t \ t, поскольку нет столбцов. Чтобы исправить это, используйте следующее:

awk -v OFS="  " -F"\t" '{print $2, $1}' abcd.txt

Где:

-F"\t" - это то, что нужно вырезать на точно (табуляция).

-v OFS=" " - это то, что нужно разделить (два пробела)

Пример:

echo 'A\tB\t\tD' | awk -v OFS="    " -F"\t" '{print $2, $4, $1, $3}'

Это выводит:

B    D    A    
...