Принудительный порядок полей вывода из команды вырезания

StackOverflow https://stackoverflow.com/questions/1037171

Вопрос

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

cat abcd.txt | cut -f 2,1 

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

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

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

Это было полезно?

Решение

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

  

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

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

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

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

Замените \ 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    
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top