我有一个文本文件,该文件开始时包含一组随机数。在第二个文件中,另一组随机数包括第一个文件中的数字。只要这些数字匹配,我就需要进行编辑。
文件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时,我尝试将代码在两个文件中滚动一行。因此,我永远都无法比赛。在使用循环时,只需要在第二个文件中滚动行即可。 任何帮助将不胜感激!
答案 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 filea
和cat -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