【问题标题】:How insert text into blank lines in any cases?在任何情况下如何将文本插入空行?
【发布时间】:2017-06-30 13:50:33
【问题描述】:

我想将File2中的文本粘贴到File1

文件1:

1
2

4
5

7
8

文件2:

3
6

输出:

1
2
3
4
5
6
7
8

作为这个问题Insert text into blank lines in bash的示例尝试:

sed -e '/^$/{R file2' -e 'd}' file1

但它仅适用于每隔一行空白的情况。我想问一下,在更复杂的情况下可能吗?换句话说,有没有通用的解决方案?

例如:

文件1

1
2
3

5
6


9

文件2

4
7
8

输出

1
2
3
4
5
6
7
8
9

【问题讨论】:

  • 使用 GNU sed 你的 sed 脚本在第二个例子中对我来说很好,在注意 File1File2 以单个换行符结尾之后。例如:注意在 89 之后点击 Return 一次。
  • “通用解决方案”是指 1) 获取两个文件,2) 合并,3) 排序 4) 消除空白?你可以做cat f1 f2 | sort | grep .

标签: bash text awk sed


【解决方案1】:

你可以试试这个 awk 脚本:

script.awk

FNR == NR  { repl[ ++i ] = $0;  next; }
NF == 0    { print repl[ ++j ]; next; }
1

像这样运行它:awk -f script.awk File2 File1

说明

  • 条件FNR == NR 的第一行仅在读取作为参数给出的第一个文件时执行。这里是File2。由于next 语句,它将替换行存储在repl 中并从File2 中读取下一行。
  • 第二行和第三行是针对作为参数给出的第二个文件执行的,这里是File1
    • 条件NF == 0 对空行为真,并从repl 打印下一个可用替换行,然后从File1 读取下一行
    • 1执行用于来自File1 的非空行,它是打印该行的快捷方式。

【讨论】:

  • @EdMorton 我更新了脚本,感谢您的建议。
【解决方案2】:

为什么不直接填充一个数组,然后打印出提供的索引:

awk 'NF{a[$1]}END{for( i in a )print i}' file1 file2

【讨论】:

  • 因为它不会按读取/期望的顺序打印值,它会以随机(散列)顺序打印两个文件中的值。你也可以这样做awk 'NF' file1 file2
  • 不...您的解决方案将按照它们在文件中出现的顺序打印它们。我会按数字顺序显示它们。
  • 不,不会,您可以在gnu.org/software/gawk/manual/gawk.html#Scanning-an-Array:The order in which elements of the array are accessed by this statement is determined by the internal arrangement of the array elements within awk 阅读有关in 运算符的信息。换句话说,它们被访问的顺序是它们存储在哈希表中的顺序,对于所有意图,您都可以认为是随机的。
  • 同意,虽然我很少遇到问题,但 asorti 应该可以解决问题;)
  • asroti() 将使其特定于 gawk,如果您使用 gawk,则可以改用 PROCINFO["sorted_in"] 但有更简单、更便携的方法来完成这项工作,并且在结束时那天我们试图用母猪耳朵做一个丝绸钱包——这是解决这个问题的错误方法。
【解决方案3】:

这是一个使用 awk 和 getline:

$ awk 'NF==0{ getline < "file2" }1' file1
1
2
3
4
5
6
7
8

9

额外的空行是file1 中有更多空白的测试,因为file2 中有值。

【讨论】:

  • 这可能是getline 的一个很好的用法。 !NF 会更短。
【解决方案4】:

使用 Perl one-lnier

轻松应对任何情况

如果您将 file_2 更改为没有 换行符 的文件,这很容易做到。


$ cat file_1
1
2
3

5
6


9
$ cat file_2
3 7 8
$
$ perl -ale '@file2=@F if $.==1; print ( /\d+/ ? @F : shift @file2 ) if $.!= 1' file_2 file_1 
1
2
3
3
5
6
7
8
9

工作原理

主要部分在这里:
print ( /\d+/ ? @F : shift @file2 )
如果该行不匹配任何数字,它会弹出 file2。就是这样。
您也可以将 @F 更改为 $_
print ( /\d+/ ? $_ : shift @file2 )

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 1970-01-01
    • 2021-07-09
    • 2020-11-19
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 2014-12-24
    • 2021-12-24
    相关资源
    最近更新 更多