假设有两个文件,“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}
对第一个文件进行操作。是一个特殊变量,用于跟踪当前行号。所以数组变成了类似的东西rename
words
NR
Awk
words['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
当传递给 的分隔符列表中使用多个分隔符时-d
,paste
连续使用这些分隔符,直到用完为止,然后再次开始使用它们。在上面的命令中,传递的两个分隔符是\0
(空字符串)和\n
(换行符)。标准输入指向该main
文件,然后在命令中通过两个-
' 引用该文件两次,所有这些都会导致一行输出,由
main
从和取一条线- 添加一个空字符串
- 取出下一行
rename
并将其添加到上面 - 然后在上面添加一个换行符
- 通过添加一行来完成循环
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