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

时间:2014-10-11 10:19:00

标签: shell unix awk

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

1 个答案:

答案 0 :(得分:2)

简单的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++)

将从第4列迭代到列的末尾。

修改

用随机数替换|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