【发布时间】:2021-09-18 21:01:21
【问题描述】:
由于我在学习awk;我发现FNR==NR 方法是处理两个文件的一种非常常用的方法。如果FNR==NR;然后是first file,当FNR 重置为1 从连接文件中读取每一行时,这意味着!(FNR==NR),显然是second file。
当涉及到 三个 或更多文件时,我看不到第二个和第三个文件的方式,因为它们都具有相同的 !(FNR==NR) 条件。这让我想弄清楚怎么会有像FNR2和FNR3这样的东西?
所以我实现了一种方法来处理一个awk 中的三个文件。假设每个文件都有FNR1FNR2FNR3。对于我制作的每个文件 for loop 单独运行。每个循环NR==FNR# 的条件都是相同的,实际上得到了我的预期:
所以我想知道是否有更清醒、更简洁的方法可以提供与 belowawkcode 类似的结果
示例文件内容
$ cat file1
X|A1|Z
X|A2|Z
X|A3|Z
X|A4|Z
$ cat file2
X|Y|A3
X|Y|A4
X|Y|A5
$ cat file3
A1|Y|Z
A4|Y|Z
AWK for 循环
$ cat fnrarray.sh
awk -v FS='[|]' '{ for(i=FNR ; i<=NR && i<=FNR && NR==FNR; i++) {x++; print "NR:",NR,"FNR1:",i,"FNR:",FNR,"\tfirst file\t"}
for(i=FNR ; i+x<=NR && i<=FNR && NR==FNR+x; i++) {y++; print "NR:",NR,"FNR2:",i+x,"FNR:",FNR,"\tsecond file\t"}
for(i=FNR ; i+x+y<=NR && i<=FNR && NR==FNR+x+y; i++) {print "NR:",NR,"FNR3:",i+x+y,"FNR:",FNR,"\tthird file\t"}
}' file1 file2 file3
当前和期望的输出
$ sh fnrarray.sh
NR: 1 FNR1: 1 FNR: 1 first file
NR: 2 FNR1: 2 FNR: 2 first file
NR: 3 FNR1: 3 FNR: 3 first file
NR: 4 FNR1: 4 FNR: 4 first file
NR: 5 FNR2: 5 FNR: 1 second file
NR: 6 FNR2: 6 FNR: 2 second file
NR: 7 FNR2: 7 FNR: 3 second file
NR: 8 FNR3: 8 FNR: 1 third file
NR: 9 FNR3: 9 FNR: 2 third file
您可以看到NR 与FNR# 对齐,并且可以读取NR 对应的file#。
另一种方法
我在这里找到了这个方法FNR==1{++f} f==1 {}Handling 3 Files using awk
但是这种方法在每次读取新行时都会替换arr1[1]
第 1 次尝试失败
$ awk -v FS='[|]' 'FNR==1{++f} f==1 {split($2,arr); print arr1[1]}' file1 file2 file3
A1
A2
A3
A4
for 循环成功(arr1[1] 不变)
$ awk -v FS='[|]' '{for(i=FNR ; i<=NR && i<=FNR && NR==FNR; i++) {arr1[++k]=$2; print arr1[1]}}' file1 file2 file3
A1
A1
A1
A1
【问题讨论】:
-
你想对不同的文件做不同的条件检查,同时读取3个以上的文件吗?
-
是的@RavinderSingh13,我将从
file1创建arr1[i]=$2,从file2创建arr2[j]=$3,从file3创建arr3[k]=$1。然后为arr1和arr2和arr123中常见的元素创建arr12用于arr1 arr2 arr3中的常见元素
标签: for-loop awk unix-text-processing