awk - 用于读取每行中具有不同字段数的输入文件的 awk 脚本
问题描述
输入文件在每行中具有不同数量的字段。
有没有办法用 awk 获得预期的输出?
awk -F',' '{print "echo "$1; for (i = 2; i <= NF; i++) print "command1 "$i " command2"}' test.txt
测试.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
解决方案
请试试这个:
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
是一个空格,所以我只是使用逗号来分隔需要打印的不同内容。
为了好玩,GNUsed
解决方案:
sed -r '/,/!d;/,/{s/([^,]*),([^,]*)/"echo" \1 "command1" \2 "command2"\n\1/; P; D;}'
awk
另一种类似于RavinderSingh13's answer 的noloop方法,但简洁:
awk -F, '{gsub(/,/,"\necho " $1 " command1 ");sub(/[^\n]*\n/,"");gsub(/\n|$/," command2\n");printf $0}' file
推荐阅读
- sql - PostgreSQL INSERT INTO 表不存在
- python - 关于python导入、函数、子目录的一个非常简单的问题
- java - SharedPreferences:为什么我的值没有被覆盖?
- graphql - 使用 request-promise 将数据发布到 graphql 服务器
- python - 重新采样 Python 熊猫排除某些字段
- excel - vba中的Instr不使用公式单元格
- php - 随着时间的推移,慢慢地用 Vue 替换 Laravel 刀片文件,但它变得混乱
- javascript - setTimeout 发送多个表单 5 分钟
- asterisk - 星号伊莎贝尔汽车公园
- javascript - 父参数可以带子参数吗?