如果我不知道字段的数量,如何逐行读取文件?

问题描述:

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随机数。有人可以帮我吗?

+0

注意的'awk'脚本无法执行shell功能(对于所有的实际目的,它可能是能够得到一个shell来运行shell函数,但这正是ShellShock找到它的目标的地方)。 – 2014-10-11 15:59:02

一个简单的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()返回内01

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 
+0

你可以请看看上面的问题我已经做了一些改变,你可以请现在建议它 – 2014-10-13 08:50:30

+0

@AshishTripurwar我没有得到你想要完成的。 – nu11p01n73R 2014-10-13 09:21:37

+0

@AshishTripurwar我做了一个编辑。希望这是你的期望。任何反馈意见 – nu11p01n73R 2014-10-13 09:56:58