在Linux中重叠两个文件或用file2

时间:2016-03-29 14:08:33

标签: linux bash awk sed

我是一个新的Linux用户,我仍然没有想出如何使用它,我以非常丑陋的方式解决了这个问题,但我相信它可以通过巧妙地使用sed或{来解决{1}}。 问题有点难以解释,但它涉及如何重叠两个由某些规则格式化的文本文件。

问题1:

规则:file1有一些等于字符串“awk”的行,这些行必须被custom分别存在的行替换,所以第一次“file2”发生在customfile1的第一行将被放置,而不是在file2中有“file2”的行,第二次“custom”出现在file1中它需要是由第二行文件2等取代 此外,custom中“custom”行的出现次数等于file1中的行数。

示例:

File1中:

file2

文件2:

line1
line2
custom
line4
custom
line6

输出:

line3
line5

解决此问题的一种方法是搜索第一次出现line1 line2 line3 line4 line5 line6 ,将其替换为custom中的第一行,从file2删除第一行,搜索下一次出现的自定义,在file2中取第一行,删除它等等。我相信使用sed / grep / awk会有更好的方法。

问题2:

我告诉他,代码的用户实际上需要指定file2,所以如果问题是这样制定的,那么解决起来会更容易:

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

文件1如下所示:

file2

文件2是:

line1                          
custom  
line3   
custom
line5

/ n代表空行,输出是

/n
line2
/n
line4
/n

另外我想输出覆盖file1的解决方案(我估计我可以通过line1 line2 line3 line4 line5 来实现)

我想解决这两个问题的解决方案,并解释你实际使用的命令是什么。

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

奖励问题:

我首先将file1中的行内容存储为单独的变量(solution >> file1$line1等),几乎用$line2解决了问题,但它不想接受{ {1}}由于awk引号,并且它不适用于$var引号。 我看到sed可以做强大的东西但是它可以用保存在字符串变量中的模式运行吗?我尝试使用''""调用sed,但是它会一直有效吗?我用awk尝试了同样的事情,但它破了。

1 个答案:

答案 0 :(得分:0)

awk救援!

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

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

line1
line2
line3
line4
line5
line6

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

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

line1
line2
line3
line3
line4