【问题标题】:Overlap of two files in Linux or respective replacement of lines from file1 with lines from file2Linux 中两个文件的重叠或将 file1 中的行分别替换为 file2 中的行
【发布时间】:2016-07-17 03:44:17
【问题描述】:

我是一个新的 Linux 用户,我还没有弄清楚如何使用它,我以非常丑陋的方式解决了这个问题,但我相信它可以通过巧妙地使用 sedawk 来解决. 问题有点难以解释,但它涉及如何重叠两个按特定规则格式化的文本文件。

问题一:

规则:file1 有一些行等于字符串“custom”,这些行必须分别替换为存在于file2 中的行,所以第一次“custom”出现在file1file2 的第一行将被放置而不是 file2 中具有“custom”的行,第二次“custom”出现在 file1 中,它需要被 file2 的第二行替换,等等。 此外,file1 中“custom”行的出现次数等于file2 中的行数。

示例:

文件1:

line1
line2
custom
line4
custom
line6

文件2:

line3
line5

输出:

line1
line2
line3
line4
line5
line6

解决这个问题的一种方法可能是搜索custom的第一个出现,用file2中的第一行替换它,从file2中删除第一行,搜索下一个自定义,取@中的第一行987654339@,删除它等等。我确信 sed/grep/awk 存在更好的方法。

问题 2:

代码的用户实际上需要像我告诉他的那样指定file2,所以如果问题是这样表述的,可能会更容易解决:

这些是规则:file1 和 file2 现在有相同的行数。 file1 中的某些行与上一个问题中的字符串“custom”相等。 File2 在 file1 中的行不等于“custom”的地方有空行,所以我真的想将 file2 粘贴到 file1 上,只用“custom”覆盖行。

文件 1 如下所示:

line1                          
custom  
line3   
custom
line5

文件 2 是:

/n
line2
/n
line4
/n

/n 代表空行,输出为

line1
line2
line3
line4
line5

我还想要覆盖 file1 的解决方案的输出(我认为我可以通过 solution >> file1 来完成)

我想要解决问题和解释你使用的命令实际上做了什么。

对于当前版本的代码,我实际上在 file1 中只有 1-3 行,所以我通过 file2 中的标题和尾行解决了很多 if-else 场景的问题,但我确信更优雅的东西是可能的.

额外问题:

我首先将file1中的行内容存储为单独的变量($line1$line2等),几乎解决了awk的问题,但它不想接受$var,因为@ 987654348@ 引号,也不适用于"" 引号。 我看到 sed 可以做强大的事情,但它可以使用保存在字符串变量中的模式运行吗?我尝试用""$var 调用sed,但它总是有效吗?我对 awk 进行了同样的尝试,但它坏了。

【问题讨论】:

  • 请展示您的尝试
  • 几乎解决了 awk 的问题:你能展示你的解决方案吗
  • 第二个例子不应该有两个line3 行吗?
  • 对不起,这是我在网上找到的,当它不起作用时放弃了。我编辑了问题 2。
  • 我的解决方案有 39 行长,file1 中的行表示我希望模拟执行的扫描点列表(数字序列,如 1 2 3 4 5),如果用户指定 2D 或 3D 扫描,则文件将有 2 或 3 行,他可以通过脚本中的标志指定他的扫描范围(这将执行他的条目的 seq ''),但如果他认为标志的值是“自定义”,那么他有指定他存储自定义扫描点的文件。

标签: linux bash awk sed


【解决方案1】:

awk 来救援!

对于第一个问题,这里有一个使用 getline 的简单解决方案,通常被认为是危险的,但如果您对副作用免疫,则没有任何危害。

$ awk '/custom/{getline < "file2"; print; next} 1' file1

line1
line2
line3
line4
line5
line6

对于第二种情况,首先将文件与一些未使用的字符组合起来,然后让 awk 选择正确的选择可能更容易。

$ paste -d~ file2 file1 | awk -F~ '{print $1==""?$2:$1}'

line1
line2
line3
line3
line4

【讨论】:

  • 完美运行,您只需将我的代码中的 39 行减少到一行。昨晚我花了很长时间在谷歌上搜索解决方案。非常感谢你:)
  • 您能否检查一下您是否对我发布的其他问题 (36317896) 有优雅的回答。我意识到我没有从这个问题中正确地制作 file1。
猜你喜欢
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2022-06-13
相关资源
最近更新 更多