Есть три варианта:
- Установка ORS на ноль ASCII:
Другие решения имеют
awk -vORS=$'\0'
, но:
$'\0'
- это конструкция, характерная для некоторых оболочек (bash, zsh).
Итак: эта команда awk -vORS=$'\0'
не будет работать в большинстве старых оболочек.
Существует возможность записать его как: awk 'BEGIN { ORS = "\0" } ; { print $0 }'
, но это не будет работать с большинством версий awk.
Печать (printf
) с символом \0
: awk '{printf( "%s\0", $0)}'
Печать напрямую ASCII 0
: awk '{ printf( "%s%c", $0, 0 )}'
Проверка всех альтернатив с помощью этого кода:
#!/bin/bash
test1(){ # '{printf( "%s%c",$0,0)}'|
a='awk,mawk,original-awk,busybox awk'
IFS=',' read -ra line <<<"$a"
for i in "${line[@]}"; do
printf "%14.12s %40s" "$i" "$1"
echo -ne "a\nb\nc\n" |
$i "$1"|
od -cAn;
done
}
#test1 '{print}'
test1 'BEGIN { ORS = "\0" } ; { print $0 }'
test1 '{ printf "%s\0", $0}'
test1 '{ printf( "%s%c", $0, 0 )}'
Мы получаем такие результаты:
awk BEGIN { ORS = "\0" } ; { print $0 } a \0 b \0 c \0
mawk BEGIN { ORS = "\0" } ; { print $0 } a b c
original-awk BEGIN { ORS = "\0" } ; { print $0 } a b c
busybox awk BEGIN { ORS = "\0" } ; { print $0 } a b c
awk { printf "%s\0", $0} a \0 b \0 c \0
mawk { printf "%s\0", $0} a b c
original-awk { printf "%s\0", $0} a b c
busybox awk { printf "%s\0", $0} a b c
awk { printf( "%s%c", $0, 0 )} a \0 b \0 c \0
mawk { printf( "%s%c", $0, 0 )} a \0 b \0 c \0
original-awk { printf( "%s%c", $0, 0 )} a \0 b \0 c \0
busybox awk { printf( "%s%c", $0, 0 )} a b c
Как видно выше, первые два решения работают только в GNU AWK.
Наиболее переносимым является третье решение: '{ printf( "%s%c", $0, 0 )}'
.
В "busybox awk" нет правильного решения.
Версии, использованные для этих тестов:
awk> GNU Awk 4.0.1
mawk> mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
original-awk> awk version 20110810
busybox> BusyBox v1.20.2 (Debian 1:1.20.0-7) multi-call binary.