用于获取两个文件中的命令值并写入新文件的 bash 脚本

标签 bash shell unix awk cut

用于获取两个文件中的命令值并写入新文件的 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/

相关文章:

linux - 使用 ls 以位为单位的文件大小?

ios - 将 git head count 添加到 CFBundleVersion

linux - 如何告诉shell命令tail不要等待参数

python - 如何正确处理和保留系统关闭(和 SIGTERM)以完成其在 Python 中的工作?

c++ - 如何在 C++ 中设置文件权限(跨平台)?

bash循环遍历文件以查找字符串的开头

bash - 如何将 Go cmd 应用程序提供为高效应用程序

linux - Shell 脚本检查字符串是否包含两个输入参数

mysql - shell脚本中mysql存储过程的关联数组

c - 为什么子进程和父进程的变量地址相同