Принудительный порядок полей вывода из команды вырезания
-
10-07-2019 - |
Вопрос
Я хочу сделать что-то вроде этого:
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