【问题标题】:shell insert a line every n linesshell 每 n 行插入一行
【发布时间】:2016-07-16 03:08:26
【问题描述】:

我有两个文件,我试图从 file2 开始每隔 4 行将一行插入到 file1 中,从 file1 的开头开始。比如:

文件1:

line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10

文件2:

50
43
21

我想得到的输出:

50
line 1
line 2
line 3
line 4
43
line 5
line 6
line 7
line 8
21
line 9
line 10

我的代码:

while read line
do
    sed '0~4 s/$/$line/g' < file1.txt > file2.txt
done < file1.txt

我收到以下错误:

sed: 1: "0~4 s/$/$line/g": invalid command code ~

【问题讨论】:

  • 它从另一个文件中读取。在这种情况下 file1
  • 您能否也显示来自file1 的示例数据?
  • 我编辑了问题,因为我的文件混淆了
  • 使用 awk 在下面发布了答案

标签: file shell awk


【解决方案1】:

以下步骤遍历这两个文件,而不将任何一个加载到内存中的数组中:

awk '(NR-1)%4==0{getline this<"file2";print this} 1' file1

如果您的实际 file2 大于您希望在内存中保存的值,这可能会更可取。

分解如下:

  • (NR-1)%4==0 - 匹配从 0 开始的每 4 行的条件
  • getline this&lt;"file2" - 从 "file2" 中获取一行并将其存储在变量 this
  • print this - 打印...这个。
  • 1 - “打印当前行”的简写,在本例中来自 file1(awk 的正常输入)

【讨论】:

    【解决方案2】:

    使用awk 可以轻松做到这一点:

    awk 'FNR==NR{a[i++]=$0; next} !((FNR-1) % 4){print a[j++]} 1' file2 file1
    
    50
    line 1
    line 2
    line 3
    line 4
    43
    line 5
    line 6
    line 7
    line 8
    21
    line 9
    line 10
    
    • 在处理输入中的第一个文件(即file2)时,我们将每一行存储在数组中,键为以0 开头的递增数字。
    • 在处理输入中的第二个文件时,即file1,我们使用模运算检查当前记录# 是否可以被4 整除,如果可以,则从file2 插入一行并递增索引计数器。
    • 最后使用动作1,我们打印来自file1的行。

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed -e 'Rfile1' -e 'Rfile1' -e 'Rfile1' -e 'Rfile1' file2
      

      或者只使用 cat 并粘贴:

      cat file1 | paste -d\\n file2 - - - -
      

      【讨论】:

        【解决方案4】:

        unix 工具链的另一种选择

        $ paste file2 <(pr -4ats file1) | tr '\t' '\n'
        
        50
        line 1
        line 2
        line 3
        line 4
        43
        line 5
        line 6
        line 7
        line 8
        21
        line 9
        line 10
        

        【讨论】:

          【解决方案5】:

          这是使用pastetr 的一种愚蠢方法

          paste file2 <(paste - - - - <file1) | tr '\t' '\n'
          

          假设您的输入文件中没有任何实际的选项卡。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多