Вы также можете сделать это с помощью одного вызова GNU awk:
reshape.awk
# Set awk to split input at whitespace characters and
# use tab as the output field separator
BEGIN {
RS="[ \t\n]+"
OFS="\t"
}
# Print using OFS or ORS based on the element index
{
printf "%s", $1 (NR%n == 0 ? ORS : OFS)
}
# Append a missing new-line when last row is not full
END {
if( NR%n != 0)
printf "\n"
}
Запустите его так:
awk -f reshape.awk n=2 infile
Или как однострочник:
awk -v n=2 'BEGIN { RS="[ \t\n]+"; OFS="\t" } { printf "%s", $1 (NR%n == 0 ? ORS : OFS) } END { if( NR%n != 0) printf "\n" }' infile
Вывод:
a aa
aaa b
bb bbb
c cc
ccc d
dd ddd
e ee
eee f
ff fff
g gg
ggg h
hh hhh
i ii
iii j
jj jjj
Или с n = 3
:
a aa aaa
b bb bbb
c cc ccc
d dd ddd
e ee eee
f ff fff
g gg ggg
h hh hhh
i ii iii
j jj jjj
У вас есть имя файла h
в каталоге, где вы запустили
echo $var
Оболочка пытается использовать [ap]
как глобус, и если что-то совпадает, он заменяет глобус совпадением. Для файла с именем h
он становится
echo h
. Вы можете предотвратить это, заключив расширение в кавычки, что приведет к тому, что оно не будет рассматриваться как glob.
echo "$var"
Не используя кавычки в echo $ var
, вы подвергаете расширение как «разбиению», так и «расширению имени пути» (также известному как «подстановка» или « генерация имени файла ").
Это означает, что строка, содержащая [
(также *
и ?
), будет расширена по правилам «раскрытия имени пути». В вашем случае это означает, что существует файл с именем, состоящим только из одного символа, с именем h
.
Если вы процитируете расширение, «Расширение имени пути» не будет выполнено:
$ echo "$var"
[a-p]