Скрипт awk для чтения входного файла с разным количеством полей в каждой строке - PullRequest
0 голосов
/ 22 января 2019

Входной файл имеет различное количество полей в каждой строке.

Есть ли способ получить ожидаемый результат с помощью awk?

awk -F',' '{print "echo "$1; for (i = 2; i <= NF; i++) print "command1 "$i " command2"}' test.txt

test.txt

"abc",4,21,22,25
"standard",1 
"test",4,5,10,11,12

Вывод:

echo "abc"
command1 4 command2
command1 21 command2
command1 22 command2
command1 25 command2
echo "standard"
command1 1 command2
echo "test"
command1 4 command2
command1 5 command2
command1 10 command2
command1 11 command2
command1 12 command2

Ожидаемый вывод:

echo "abc" command1 4 command2
echo "abc" command1 21 command2
echo "abc" command1 22 command2
echo "abc" command1 25 command2
echo "standard" command1 1 command2
echo "test" command1 4 command2
echo "test" command1 5 command2
echo "test" command1 10 command2
echo "test" command1 11 command2
echo "test" command1 12 command2

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Пожалуйста, попробуйте это:

awk -F, '{for (i=2;i<=NF;i++) print "echo", $1, "command1", $i, "command2"}'

Например:

$ cat file
"abc",4,21,22,25
"standard",1
"test",4,5,10,11,12

$ awk -F, '{for (i=2;i<=NF;i++) print "echo", $1, "command1", $i, "command2"}' file
echo "abc" command1 4 command2
echo "abc" command1 21 command2
echo "abc" command1 22 command2
echo "abc" command1 25 command2
echo "standard" command1 1  command2
echo "test" command1 4 command2
echo "test" command1 5 command2
echo "test" command1 10 command2
echo "test" command1 11 command2
echo "test" command1 12 command2

По умолчанию OFS - это пробел, поэтому я просто использую запятые для разделения разных вещей, которые необходимо напечатать.

Для удовольствия, GNU sed решение:

sed -r '/,/!d;/,/{s/([^,]*),([^,]*)/"echo" \1 "command1" \2 "command2"\n\1/; P; D;}'

Другой подход noloop awk, аналогичный RavinderSingh13, ответ , но сжатый:

awk -F, '{gsub(/,/,"\necho " $1 " command1 ");sub(/[^\n]*\n/,"");gsub(/\n|$/," command2\n");printf $0}' file
0 голосов
/ 22 января 2019

Другой подход без использования петель здесь.

awk -F, '
/^\"/ && prev{
  print prev
  prev=""
}
{
  gsub(/,/,"\necho "  $1  " command1 ")
}
{
  gsub(/$/," command2")
  prev=$0
  sub(/.*\"\n/,"",prev)
  gsub(/\n/," command2\n",prev)
}
END{
  if(prev){
    print prev
  }
}'   Input_file

Вывод будет следующим.

echo "abc" command1 4 command2
echo "abc" command1 21 command2
echo "abc" command1 22 command2
echo "abc" command1 25 command2
echo "standard" command1 1  command2
echo "test" command1 4 command2
echo "test" command1 5 command2
echo "test" command1 10 command2
echo "test" command1 11 command2
echo "test" command1 12 command2
0 голосов
/ 22 января 2019

Просто поместите оператор echo внутри цикла for

$ awk -F',' '{for (i = 2; i <= NF; i++) print "echo "$1  " command1 "$i " command2"}' test.txt
echo "abc" command1 4 command2
echo "abc" command1 21 command2
echo "abc" command1 22 command2
echo "abc" command1 25 command2
echo "standard" command1 1  command2
echo "test" command1 4 command2
echo "test" command1 5 command2
echo "test" command1 10 command2
echo "test" command1 11 command2
echo "test" command1 12 command2

$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...