- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于我正在学习awk
;我发现 FNR==NR
方法是处理两个文件的一种非常常用的方法。如果 FNR==NR
;然后它是第一个文件
,当FNR
重置为1
,同时从串联文件中读取每一行时,这意味着!(FNR== NR)
显然是第二个文件
。
当涉及到三个 或更多文件时,我看不到第二个和第三个文件的方式,因为它们具有相同的 !(FNR==NR)
健康)状况。这让我想弄清楚怎么会有像 FNR2
和 FNR3
这样的东西?
所以我实现了一个awk
处理三个文件的方法。假设每个文件都有 FNR1
FNR2
FNR3
。我为每个文件制作了单独运行的 for 循环
。每个循环的条件都相同 NR==FNR#
并且实际上得到了我的预期:
所以我想知道是否有更清醒、简洁的方法可以提供与以下awk
代码类似的结果
示例文件内容
$ 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
最佳答案
When it comes to three or more files I can't see a way which is secondand third file as both have the same !(FNR==NR) condition. This mademe to try to figure out how can there be something like FNR2 and FNR3?
示例如下:
$ cat f1
X|A1|Z
X|A2|Z
X|A3|Z
X|A4|Z
$ cat f2
X|Y|A3
X|Y|A4
X|Y|A5
$ cat f3
A1|Y|Z
A4|Y|Z
示例输出:
$ awk -F '|' 'FNR==1{file++}{array[file, FNR]=$0; max=max>FNR?max:FNR}END{for(f=1; f<=file; f++){ for(row=1; row<=max; row++){ key=f SUBSEP row; if(key in array)print "file: "f,"row :"row,"record: "array[key] } }}' f1 f2 f3
file: 1 row :1 record: X|A1|Z
file: 1 row :2 record: X|A2|Z
file: 1 row :3 record: X|A3|Z
file: 1 row :4 record: X|A4|Z
file: 2 row :1 record: X|Y|A3
file: 2 row :2 record: X|Y|A4
file: 2 row :3 record: X|Y|A5
file: 3 row :1 record: A1|Y|Z
file: 3 row :2 record: A4|Y|Z
解释:
awk -F '|' 'FNR==1{ # FNR will reset for every file
file++ # so whenever FNR==1 increment variable file
}
{
# array name : array
# array key being : file, FNR
# array value : $0 which current record/row
array[file, FNR] = $0;
# here we find which row count in all available files
max = max > FNR ? max : FNR
}
END{ # end block when all files are read
# start iterating over file
# as we now variable file hold total no files read
for(f=1; f<=file; f++)
{
# iterate now for record from each file
# variable max holds max row count
for(row=1; row<=max; row++)
{
# variable key will now have
# key = file-number SUBSET row-number
key=f SUBSEP row;
# if key exists in array
# print array value
if(key in array)
print "file: "f,"row :"row,"record: "array[key]
}
}
}' f1 f2 f3
其他选项是使用真正的多维数组,如下所示。 gawk
当然是特定的。
假设文件名是唯一的,否则使用 FNR==1{ file++}
并使用 file
代替 FILENAME
$ awk --version
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 3.1.6-p2, GNU MP 6.1.2)
Copyright (C) 1989, 1991-2018 Free Software Foundation.
$ awk -F '|' '{
true_multi_array[FILENAME][FNR] = $0
}
END{
for(file in true_multi_array)
for(row in true_multi_array[file])
print "file:",file, "row :" row, "record:" true_multi_array[file][row]
}' f1 f2 f3
file: f1 row :1 record:X|A1|Z
file: f1 row :2 record:X|A2|Z
file: f1 row :3 record:X|A3|Z
file: f1 row :4 record:X|A4|Z
file: f2 row :1 record:X|Y|A3
file: f2 row :2 record:X|Y|A4
file: f2 row :3 record:X|Y|A5
file: f3 row :1 record:A1|Y|Z
file: f3 row :2 record:A4|Y|Z
关于for-loop - AWK:用类似于FNR==NR的方法连接并处理三个或更多文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68300877/
我正在使用 nr 高达 128 的 io_submit(..., nr, ...),但我提交的请求通常较少。 根据手册IO_SUBMIT(2) ,这是合法的,但我想知道:为什么?此外,有没有一种方法可
我正在学习使用 awk 进行文件比较。 我找到了如下语法, awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2 我不明白NR==FNR在这里面
性能上有什么实际差异吗? 它更快吗? (假设我在同一个程序中至少使用了 100 个案例,它会在速度方面提高我的程序吗?) 最佳答案 这个问题可能更适合 Software Engineering Sta
我对 python 和 pandas 相对陌生,所以我可能无法完全理解所有可能性,并且希望得到如何解决以下问题的提示: 我有一个df就像这个: Jan Feb Mar Apr i
我们在windows下安装MySQL时会出现Access denied for user 'root'@localhost'(using password:No)的问题,这个问题是因为你的机器上之前
我是数据库的初学者,我有以下内容:我需要展示那些有最多不正确学生的类(class)(所以那些还没有带书的人和那些迟于 date_to_return 带书的人) 表格类(class):类(class)代
我需要使用正则表达式来解析数据文件的特定行。我的匹配测试命令有效,我的特定行号测试命令有效,但是当我将它们放在一起时,我没有输出。 gawk 'NR==42 {print $0}' filename
我最近试用了 Google 的 seq2seq建立一个小型的 NMT 系统。我设法让一切正常运行,但我仍然想知道模型的轮数和训练步骤数之间的确切差异。 如果我没记错的话,一个 epoch 由多个训练步
是否可以将顶部的这三个函数合二为一,并且当我单击按钮滚动所有三个函数时,每个骰子仍然无法获得相同的随机数?澄清这些功能是当我点击单个骰子时的功能,而底部的功能是当我想同时滚动所有三个骰子时的功能!所有
我正在尝试制作一个程序,它从 X 个问题中随机挑选 10 个问题(目前随机编写了 14 个问题),而不会再次挑选相同的问题,但我已经在这个垃圾问题上被困了 4 个小时。 我的问题是“randomNum
在 numpy 中获取下一个信号值之前获取行的 nr 的有效方法是什么? 我有一个信号值列表 (-1, nan, 1),它看起来与下表类似,并且想获得另一个列表,其中包含行数 nr 值,直到下一个信号
我需要在我的 Fortran 90 代码中使用 MRQMIN 子例程。在这个子程序里面还有一些其他的模块nrtype.90 , nrutil.f90和 nr.f90 .我正在使用这些命令编译所有这些模
我正在运行以下命令,只要它们是第一个文件中的内容,它就可以很好地工作: awk -F, 'FNR==NR {a[tolower($1)]++; next} !a[tolower($1)]' OutSi
我正在做一些聚合以获得关于类别中有多少产品的一些统计数据。 经过一些管道后我归结为: [ { topCategory: "Computer", mainCategory: "S
我正在尝试使用 Android API 在 Samsung S20 (T-Mobile) 上检测 5G Nr 小区信息 CellIdentityNr https://developer.android
在过去的几个小时里,我一直在尝试用 awk 解决这个愚蠢的问题,但到目前为止还没有成功。我了解如何绘制每一行,例如: awk 'NR%2' file 而且我还了解如果一列在特定范围内如何打印基于列的文
苹果会在今年发布iPhone12,iPhone12(一些更高的设备类型)可以支持5G功能,我认为iPhone12应该是基于iOS14平台的,所以我研究了iOS14的API,但我们可以'找不到任何关于
嗨,我正在尝试使用 awk 命令找到正则表达式后打印 5 行。我有以下内容: line_start=$(awk '/regex/{print NR}' file) let line_end=$line
有人可以告诉我解决问题的最佳数据结构选择是什么吗@http://acm.timus.ru/problem.aspx?space=1&num=1027。 复制到这里供引用。 问题 A text of a
我们可以将 NR 传递给 awk 中的变量吗? 我有一个脚本是这样的: awk -v { blah blah.. .......... count-- pr
我是一名优秀的程序员,十分优秀!