使用awk更改基于其他纺织品的文本文件

时间:2018-07-12 17:01:04

标签: string awk

我有一个文本文件,该文件开始时包含一组随机数。在第二个文件中,另一组随机数包括第一个文件中的数字。只要这些数字匹配,我就需要进行编辑。

文件b

1
5
7
9

提交一个

1 100 100 100
4 100 100 100
5 100 100 100
7 100 100 100
8 100 100 100
9 100 100 100
11 100 100 100
12 100 100 100

输出

1 10000 10000 10000
4 100 100 100
5 10000 10000 10000
7 10000 10000 10000
8 100 100 100
9 10000 10000 10000
11 100 100 100
12 100 100 100

我尝试了以下操作:

awk 'NR==FNR{a[NR]=$1;next} {    
    while(getline && end=="") {
        if (a[FNR]==$1){
            end=1;
            print $1, $2,"00", $3,"00",$4,"00"
        }else{
            print $1, $2, $3, $4
        }
    }         
}' b.inp a.inp > new.inp

但是,当我使用getline时,我尝试将代码在两个文件中滚动一行。因此,我永远都无法比赛。在使用循环时,只需要在第二个文件中滚动行即可。 任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

请您尝试按照以下说明操作,如果有帮助,请告诉我。

awk  'FNR==NR{a[$0];next} ($1 in a){for(i=2;i<=NF;i++){$i="10000"}} 1' fileb filea

OR

awk  'FNR==NR{a[$0];next} ($1 in a){for(i=2;i<=NF;i++){$i=$i*100}} 1' fileb filea

似乎OP的Input_file中可以控制M个字符,所以请检查一下cat -v fileacat -v fileb吗?如果是,则通过执行tr -d '\r' < Input_file > temp_file && mv temp_file Input_file

删除它们

答案 1 :(得分:2)

Awk自动逐行读取文件,因此无需调用getline

只需将fileb中的键保存在数组中,然后在filea的第一列匹配时,将第二至最后一列的值乘以100:

awk 'NR == FNR { lines[$0]; next } 
$1 in lines { for (col = 2; col <= NF; ++col) $col *= 100 } 1' fileb filea

答案 2 :(得分:-1)

这是使用getline的方法。实际上,它将为第二个文件保存不必要的if语句(如果您关心此小的性能更改)。

awk 'BEGIN{while( getline line<"fileb" ) {a[line]} 
($1 in a) { for (col = 2; col <= NF; ++col) $col *= 100 } 1' filea