Команда 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
Вот как 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
.
Если вы указываете больше параметров для 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 --