将文本粘贴到交替行上

将文本粘贴到交替行上

假设有两个文件,“main”和“rename”。文件“rename”有几行,其名称用于附加在文件“main”的备用行上。 (根据“重命名”中的位置)

我一直用于paste连接来自不同文件的行,但我被困在这种情况下。

有没有其他方法可以在不使用复制和粘贴的情况下执行此操作? (最好使用可以在 Ubuntu Linux 18.04 中轻松使用的命令。)

文件“主”

#
stars
#
twinkle
#
on
#
the
#
sky

文件“重命名”

yellow
white
green
red
blue

期望的输出

#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

答案1

您可以Awk通过处理这两个文件来使用,将一个文件内容保留在系统内存中,而在我们迭代它时将其他文件内容保留在系统内存中。

awk 'FNR==NR{ words[NR]=$0; next}{ if ($0 ~ /^#/) $0 = $0 words[++idx];  print }' rename main

其工作原理的简要说明

  • 该部分通过在数组中索引文件内容来FNR==NR{ words[NR]=$0; next}对第一个文件进行操作。是一个特殊变量,用于跟踪当前行号。所以数组变成了类似的东西renamewordsNRAwkwords['1']="yellow", words['2']="white"
  • {..}现在的部分适用于下一个文件rename,如果该行匹配,我们通过附加创建的数组中的元素来#更新当前行。$0
  • 对于以它开头的行,该print命令将打印在 后面附加了字符串的行#,而其他行则按原样打印。

答案2

只需一次paste调用即可轻松完成此操作

<main paste -d '\0\n' - rename -
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

当传递给 的分隔符列表中使用多个分隔符时-dpaste连续使用这些分隔符,直到用完为止,然后再次开始使用它们。在上面的命令中,传递的两个分隔符是\0(空字符串)和\n(换行符)。标准输入指向该main文件,然后在命令中通过两个-' 引用该文件两次,所有这些都会导致一行输出,由

  1. main从和取一条线
  2. 添加一个空字符串
  3. 取出下一行rename并将其添加到上面
  4. 然后在上面添加一个换行符
  5. 通过添加一行来完成循环 main

等等

答案3

这是一个使用的方法粘贴。首先将第二个文件加倍行距,以便有趣的行并行。其次,使用值 \0 或 NUL 将这些行粘贴在一起,这基本上不会显示为空格。我们可以使用多种方案来使输出加倍行距,但粘贴很方便(例如sed如前所述,*其他人请参阅如何在输出流中加倍换行符)。

两个原始文件的显示表明双倍行距可以实现对齐。使用默认分隔符粘贴两个文件只是显示了对齐方式。真正的答案有两种方式,一种是使用临时文件的标准方式,第二种是使用进程替换。

这是脚本片段:

FILE1=${1-data1}
shift
FILE2=${1-data2}
E="expected-output"

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

pl " Input $FILE1 and $FILE2, columnized to save visual space:"
paste $FILE1 $FILE2 | expand -30

pl " Expected output:"
cat $E

rm -f t0
pl " Results, paste with double-space $FILE2, default options:"
# sed '/^$/d;G' $FILE2 > t0
paste -d '\n' - /dev/null < $FILE2 > t0
paste $FILE1 t0

pl " Results with paste of NUL, \0:"
paste -d'\0' $FILE1 t0

pl " Results with paste, process substitution:"
paste -d'\0' $FILE1 <( sed '/^$/d;G' $FILE2 )

生产:

 Input data1 and data2, columnized to save visual space:
#                             yellow
stars                         white
#                             green
twinkle                       red
#                             blue
on                            
#                             
the                           
#                             
sky                           

-----
 Expected output:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

-----
 Results, paste with double-space data2, default options:
#       yellow
stars
#       white
twinkle
#       green
on
#       red
the
#       blue
sky

-----
 Results with paste of NUL, \0:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

-----
 Results with paste, process substitution:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

这是在如下系统上完成的:

OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution        : Debian 8.11 (jessie) 
bash GNU bash 4.3.30
paste (GNU coreutils) 8.23

干杯,drl

相关内容