Почему printf «% s» объединяет две следующие строки вместе? [дубликат]

Команда awk , используемая OP, просто имеет синтаксическую ошибку, "; в конце оператора печати

$ awk '{ split ($5,w5,","); for (i in w5) { print $1"\t"$2"\t"$3"\t"$4"\t"w5[i]"\t"$6 } }' ip.txt
jayesh  30,20,50,60 30:20:40,60:55  A   AB  SM1,SM2
jayesh  30,20,50,60 30:20:40,60:55  A   KL  SM1,SM2
jayesh  30,20,50,60 30:20:40,60:55  A   CD  SM1,SM2
rahul   10,80,50,90 25:55:60,25 SGF AAAA    SM3,SM4,SM4
rahul   10,80,50,90 25:55:60,25 SGF BCD SM3,SM4,SM4
rahul   10,80,50,90 25:55:60,25 SGF RTY SM3,SM4,SM4
pravin  89,78,40,20 25:30:55,96:25  M   J   SD10,SD12
sarika  10,20,48    29:50:30,25 T   K   SD20,SD39
sarika  10,20,48    29:50:30,25 T   L   SD20,SD39

Кроме того, можно установить разделитель выходных полей для более чистого синтаксиса, спасибо @fedorqui за предложение

awk -v OFS='\t' '{ split ($5,w5,","); for (i in w5) { print $1,$2,$3,$4,w5[i],$6 } }' ip.txt

или

awk -v OFS='\t' '{ split ($5,w5,","); for (i in w5) { $5 = w5[i]; print } }' ip.txt


Аналогичное решение с perl

$ perl -lane 'print join "\t", @F[0..3],$_,@F[5..$#F] foreach split /,/,$F[4]' ip.txt 
jayesh  30,20,50,60 30:20:40,60:55  A   AB  SM1,SM2
jayesh  30,20,50,60 30:20:40,60:55  A   KL  SM1,SM2
jayesh  30,20,50,60 30:20:40,60:55  A   CD  SM1,SM2
rahul   10,80,50,90 25:55:60,25 SGF AAAA    SM3,SM4,SM4
rahul   10,80,50,90 25:55:60,25 SGF BCD SM3,SM4,SM4
rahul   10,80,50,90 25:55:60,25 SGF RTY SM3,SM4,SM4
pravin  89,78,40,20 25:30:55,96:25  M   J   SD10,SD12
sarika  10,20,48    29:50:30,25 T   K   SD20,SD39
sarika  10,20,48    29:50:30,25 T   L   SD20,SD39
10
24.11.2018, 16:11
2 ответа

Вот как printfдолжно вести себя:

The format operand shall be reused as often as necessary to satisfy the argument operands. Any extra b, c, or s conversion specifiers shall be evaluated as if a null string argument were supplied; other extra conversion specifications shall be evaluated as if a zero argument were supplied. If the format operand contains no conversion specifications and argument operands are present, the results are unspecified.

В вашем случае формат %sповторяется столько раз, сколько необходимо для обработки всех аргументов.

printf "%s" a b

и

printf "%s%s" a b

дают тот же результат, потому что в первом случае %sповторяется дважды, что эквивалентно %s%s.

14
27.01.2020, 20:00

Если вы указываете больше параметров для printf, чем ожидает строка формата, строка формата повторяется.

Например

$ printf "%s -- %s" a b c d e
a -- bc -- de -- 

Мы видим, что формат %s -- %sэффективно повторяется.

Это может быть полезно; например для форматирования

$ printf "%s -- %s\n" a b c d e
a -- b
c -- d
e -- 
8
27.01.2020, 20:00

Теги

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