用于获取两个文件中的命令值并写入新文件的 Bash 脚本
需要 bash 脚本来查找两个文件中的共同值并以某种模式将其写入新文件。我可以获得共同值,但无法使模式发挥作用。
$ cat file1
1
2
3
4
6
7
8
10
12
13
16
20
21
22
23
27
30
$ cat file2
1
2
3
4
8
10
12
13
16
20
21
22
23
27
所需输出:
1:4
8
10
12:13
16
20:23
27
最佳答案
要获得共同点,您可以执行一些简单的操作,例如
awk 'NR==FNR{x[$1]=1} NR!=FNR && x[$1]' file1 file2
这给你留下了一个列表,你需要将元素分组到范围内。这是一个简单的 awk 脚本:
awk 'NR==1 {s=l=$1; next} $1!=l+1 {if(l == s) print l; else print s ":" l; s=$1} {l=$1} END {if(l == s) print l; else print s ":" l; s=$1}'
把它们放在一起:
awk 'NR==FNR{x[$1]=1} NR!=FNR && x[$1]' file1 file2 | awk 'NR==1 {s=l=$1; next} $1!=l+1 {if(l == s) print l; else print s ":" l; s=$1} {l=$1} END {if(l == s) print l; else print s ":" l; s=$1}'
说明:
我们跟踪当前范围的起点和我们看到的最后一个值。
NR==1 {s=l=$1; next}
NR==1 仅在第一行运行。它始终是范围的第一个元素。接下来跳过其他命令。
$1!=l+1 {if(l == s) print l; else print s ":" l; s=$1}
如果运行中有中断,则给定行 ($1) 的值将不是最后一行 (l + 1) 之后的值,因此我们打印出范围。如果开始和结束相同,我们打印出一个数字;否则我们打印出开头,后跟冒号,最后是结束。
{l=$1}
我们在进行范围检查后更新最后一行。
END {if(l == s) print l; else print s ":" l; s=$1}
我们必须在最后再次运行逻辑才能打印出最后一个范围
关于用于获取两个文件中的命令值并写入新文件的 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17115377/