Сортировка внутри awk с табуляцией в качестве разделителя полей

Я поэкспериментировал, и это не совсем так, как вы хотите, поскольку :r всегда будет переходить на новую строку. Но он должен делать то, что вы хотите для результата.

:.!UUID=`uuidgen` ; echo "<uuid>$UUID</uuid>"

Он помещает стандартный вывод в текущую строку (не в курсор)-интеллектуальные операции выполняются с помощью вызываемой команды.

1
07.04.2020, 19:05
3 ответа

выбрал один из этих вариантов:

... | "sort -k2 -t \\\t "
... | "sort -k2 -t \"\t\" "
... | "sort -k2 -t'\''\t'\'' "
... | "sort -k2 -t \047\011\047" ## preferred 

\011— код октета ASCII для символа Tab / \047для одинарной кавычки '

awk -v q="'"... { print | "sort -k2 -t " q "\t" q }'
awk -v tb="'\t'"... { print | "sort -k2 -t " tb }'
awk -v tb=$'\t'... { print | "sort -k2 -t \"" tb "\"" }'
awk -v tb=$'\t' -v q="'"... { print | "sort -k2 -t " q tb q }'

и многое другое…; читать Shell Quoting Issues в awk ; см. также Escape-последовательности в awk

4
28.04.2021, 23:18

FWIW, вот как бы я решил вашу актуальную проблему сортировки данных, но с сохранением заголовка вверху:

awk -v OFS='\t' '{print (NR>1), $0}' file.tsv | sort -t$'\t' -k1,1n -k3 | cut -f2-

Вышеупомянутое работает путем добавления 0 или 1 к входным данным (0 для первой строки, 1 для всех остальных строк ), поэтому вы можете сначала отсортировать этот индикатор, а затем ваш реальный ключ, который вам нужен, и затем просто удалите это добавленное поле снова.

Вот это работает поэтапно:

$ awk -v OFS='\t' '{print (NR>1), $0}' file.tsv
0   head_1  head_2  head_3
1   aaa zzz c   300
1   bbb yyy ooo a   100
1   ccc xxx nnn b   200

$ awk -v OFS='\t' '{print (NR>1), $0}' file.tsv | sort -t$'\t' -k1,1n -k3
0   head_1  head_2  head_3
1   bbb yyy ooo a   100
1   ccc xxx nnn b   200
1   aaa zzz c   300

$ awk -v OFS='\t' '{print (NR>1), $0}' file.tsv | sort -t$'\t' -k1,1n -k3 | cut -f2-
head_1  head_2  head_3
bbb yyy ooo a   100
ccc xxx nnn b   200
aaa zzz c   300
0
28.04.2021, 23:18

Это может быть не совсем однострочный способ, но простой и не нужно играть с символом табуляции... :D

var=$(head -1 file.tsv);perl -ne '{ print $_ if $. > 1; }'  file.csv| sort -k2 | sed "1 i $var" | column -ts "\t"
1
28.04.2021, 23:18

Теги

Похожие вопросы