【问题标题】:How to replace each new line in file A with the line at the same position in File B如何将文件A中的每一行替换为文件B中相同位置的行
【发布时间】:2020-05-04 14:08:12
【问题描述】:

我有两个包含相同内容行数的文件(文件 A 和文件 B)。

文件-A:

a_line_x
a_line_y

a_line_z

a_line_t

文件-B:

b_line_x
b_line_y
-------------
b_line_z
---##---##---
b_line_t

我想用出现在 fileB 中相同位置的行替换 fileA 中的换行符(在示例中为虚线),这样:

a_line_x
a_line_y
-------------
a_line_z
---##---##---
a_line_t

是否可以使用 sed 或 awk 之类的 linux 命令来做到这一点?

【问题讨论】:

    标签: awk sed text-processing


    【解决方案1】:

    编辑:要处理文件中的控制 M 字符并在处理之前将其删除,请尝试以下操作。

    awk '
    {
      gsub(/\r/,"")
    }
    FNR==NR{
      if($0!~/[a-zA-Z]+/){
        a[++count]=$0
      }
      next
    }
    /^$/{
      print a[++i]
      i=i==2?0:i
      next
    }
    1
    '  fileB  fileA
    


    请您尝试关注一下。

    awk '
    FNR==NR{
      if($0!~/[a-zA-Z]+/){
        a[++count]=$0
      }
      next
    }
    /^$/{
      print a[++i]
      i=i==2?0:i
      next
    }
    1
    '  fileB  fileA
    

    【讨论】:

    • 您好,感谢您的回复。不幸的是,它没有达到我想要的效果。作为输出,我得到了一个与文件 A 相同的文件
    • @zwlayer,这对我来说效果很好。从故障排除的角度来看,您能否通过运行命令 cat -v fileAcat -v fileB 检查您的两个文件中是否包含控制 M 字符,如果找到它们,然后通过执行 tr -d '\r' < fileA > temp && mv temp fileA 删除它们,让我知道它是怎么回事?
    • 我已经尝试过,但我得到了这个错误:tr: extra operand ‘fileA’ 尝试‘tr --help’获取更多信息。
    • @zwlayer tr -d '\r' < fileA > temp && mv temp fileA 你的意思是运行这个确切的命令吗?
    • 对不起,错误现在已经消失,但我仍然得到与输出文件 A 相同的文件
    【解决方案2】:

    基于Using getline into a Variable from a File的短awk方法:

    awk '{ getline r < "file2" }NF == 0{ $0=r }1' file1
    

    输出:

    a_line_x
    a_line_y
    -------------
    a_line_z
    ---##---##---
    a_line_t
    

    【讨论】:

    • @zwlayer,不难理解file1fileAfile2fileB(人类逻辑)
    猜你喜欢
    • 2018-03-13
    • 2019-01-16
    • 2012-09-20
    • 2017-01-12
    • 2013-06-03
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2019-05-16
    相关资源
    最近更新 更多