如果我不知道字段的数量,如何逐行读取文件?
filename.csv
包含:如果我不知道字段的数量,如何逐行读取文件?
public|database|subs_vw|5|6|9|3|10|1
基本上我的脚本是这样的:
#!/bin/bash
function replace_col(){
prep_cmd="awk -F\| 'BEGIN {srand()}
{sub(\$$1,\"Sa\"int(rand()*100000)\"GA\"); print}' \
$tablename.data > $tablename.ano"
echo $prep_cmd
eval $prep_cmd
}
tablename="subs_vw"
gawk 'BEGIN {FS="|"}
{ for(i=4;i<=NF;i++)
var="echo $i"
echo $var
replace_col $i
}' < filename.csv
给予文件作为输入,它需要正确的值,但不调用函数。基本上我想要替换所有指定的列,例如5 | 6 | 9 | 3 | 10 | 1随机数。有人可以帮我吗?
一个简单的for
循环可以达到目的。
gawk 'BEGIN {FS="|"}
{ print "SCHEMA :" $1
print "DATABASE :" $2
print "TABLENAME :" $3
for(i=4;i<=NF;i++)
print "COLUMN :" $i
}' filename.txt
这里NF
是字段数,每行中的列。
for(i=4;i<=NF;i++)
将迭代从第四列到列的末尾。
编辑
与随机数更换|5|6|9|3|10|1
。
awk -F\| '{OFS = "|";for(i=4;i<NF;i++) $i= int(rand()*100); print $0 }' inputfile
将产生一个输出中的
public|database|subs_vw|23|29|84|15|58|1
它做什么
$i= int(rand()*100)
第i个字段由随机数代替。
rand()
返回内0
和1
int()
截断值的随机数为整数
print $0
打印整个记录。
EDIT2
变化5 6 9 10
随机值
$awk -F\| 'BEGIN{OFS = "|"; indx[1]=5; indx[2]=6; indx[3]=9; indx[4]=10 }{for(i in indx) if(indx[i]<=NF) $indx[i]=int(rand()*100); print $0 }' file
public|database|subs_vw|5|29|84|3|10|15|23
你可以请看看上面的问题我已经做了一些改变,你可以请现在建议它 – 2014-10-13 08:50:30
@AshishTripurwar我没有得到你想要完成的。 – nu11p01n73R 2014-10-13 09:21:37
@AshishTripurwar我做了一个编辑。希望这是你的期望。任何反馈意见 – nu11p01n73R 2014-10-13 09:56:58
注意的'awk'脚本无法执行shell功能(对于所有的实际目的,它可能是能够得到一个shell来运行shell函数,但这正是ShellShock找到它的目标的地方)。 – 2014-10-11 15:59:02