Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于读取每行中具有不同字段数的输入文件的awk脚本_Awk - Fatal编程技术网

用于读取每行中具有不同字段数的输入文件的awk脚本

用于读取每行中具有不同字段数的输入文件的awk脚本,awk,Awk,输入文件在每行中有不同数量的字段 有没有办法用awk获得预期的输出 awk-F',''{print“echo”$1;for(i=2;i只需将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 ec

输入文件在每行中有不同数量的字段

有没有办法用awk获得预期的输出


awk-F',''{print“echo”$1;for(i=2;i只需将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

$
$awk-F',''{对于(i=2;i请尝试以下方法:

awk -F, '{for (i=2;i<=NF;i++) print "echo", $1, "command1", $i, "command2"}'
另一种noloop
awk
方法类似于但简洁:

awk -F, '{gsub(/,/,"\necho " $1 " command1 ");sub(/[^\n]*\n/,"");gsub(/\n|$/," command2\n");printf $0}' file

这里没有使用循环的不同方法

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

您的输入是CSV,因此-第一个字段是否可以包含逗号,例如
“hello,world”,3,7,21
?转义引号如何,例如
“hello,\“world\”,3,7,21
“hello”,“world”“,3,7,21
?换行如何?
$ 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
sed -r '/,/!d;/,/{s/([^,]*),([^,]*)/"echo" \1 "command1" \2 "command2"\n\1/; P; D;}'
awk -F, '{gsub(/,/,"\necho " $1 " command1 ");sub(/[^\n]*\n/,"");gsub(/\n|$/," command2\n");printf $0}' file
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