Я поэкспериментировал, и это не совсем так, как вы хотите, поскольку :r всегда будет переходить на новую строку. Но он должен делать то, что вы хотите для результата.
:.!UUID=`uuidgen` ; echo "<uuid>$UUID</uuid>"
Он помещает стандартный вывод в текущую строку (не в курсор)-интеллектуальные операции выполняются с помощью вызываемой команды.
выбрал один из этих вариантов:
... | "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
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
Это может быть не совсем однострочный способ, но простой и не нужно играть с символом табуляции... :D
var=$(head -1 file.tsv);perl -ne '{ print $_ if $. > 1; }' file.csv| sort -k2 | sed "1 i $var" | column -ts "\t"