Принуждение порядка выходных полей из команды cut
Я хочу сделать что-то вроде этого:
cat abcd.txt | cut -f 2,1
и я хочу, чтобы порядок был 2, а затем 1 на выходе. На машине, которую я тестирую (FreeBSD 6), этого не происходит (ее печать в 1,2 порядке). Можете ли вы сказать мне, как это сделать?
Я знаю, что всегда могу написать оболочку script, чтобы сделать это, но я ищу что-то, используя опции команды "cut".
Я думаю, что использую версию 5.2.1 coreutils, содержащую разрез.
Ответы
Ответ 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