Подтвердить что ты не робот

Принуждение порядка выходных полей из команды cut

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

cat abcd.txt | cut -f 2,1 

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

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

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

4b9b3361

Ответ 1

Это невозможно сделать с помощью разреза. Согласно странице руководства:

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

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

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

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

Ответ 2

Ответ Ларса был замечательным, но я нашел еще лучший. Проблема с ним в том, что она соответствует \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