我想在 UNIX 系统上另一个文件的最后一个单词后面附加文件文本。
文件1
& program executed successfully
文件2
Hello
World
This is a sample output
我想复制前两个单词并将它们粘贴到文件 2 的最后一个单词之后。
预期输出:
文件3
Hello
World
This is a sample output & program
File2 末尾有一个换行符,因此当我尝试使用 时cat
,它会在新行上打印,而不是在同一行的最后一个单词之后打印。请建议使用 UNIX 命令和 bash shell 的解决方案。
答案1
您可以选择每行的前 2 个单词file2
:
$ cut -d' ' -f1-2 file1
& program
所以你可以用它来做这样的事情:
$ printf '%s %s\n' "$(cat file2)" "$(cut -d' ' -f1-2 file1)" > file3
$ cat file3
Hello
World
This is a sample output & program
如果您的文件可以有多于一行,而您只需要第一行,则将其传递head
:
printf '%s %s\n' "$(cat file2)" "$(cut -d' ' -f1-2 file1 | head -n1)"
答案2
我觉得特登的回答如果您知道第二个文件很短,那就很好了。如果您不知道它很短,或者您知道它是一个足够长的文件,希望避免将其读入命令替换中,那么您可以选择避免在替换中扩展超过文件的最后一行像那样:
{
sed '$d' file2
printf '%s %s\n' "$( tail -n 1 file2 )" "$( cut -d ' ' -f -2 file1 )"
} >file3
首先用于sed
输出 中除最后一行之外的所有内容file2
,然后我们使用 terdon 代码的修改变体来输出 中的最后一行file2
以及前两个空格分隔的单词file1
。
答案3
你可以使用一个小ed
程序:
ed -s file2 << \EOF
$r !cut -d " " -f1,2 file1
-1,.j
w file3
EOF
或者,作为一句话:
printf '%s\n' '$r !cut -d " " -f1,2 file1' '-1,.j' 'w file3' | ed -s file2
答案4
和awk
:
awk 'NR==FNR { append=$1 OFS $2; next }
prev!=""{ print prev } { prev=$0 }
END{ print prev, append }' file1 file2
通过将当前行保存到临时变量中,prev
我们将输出行延迟一个,因此在处理所有行时,我们将文件 1 中的文本附加到文件 2 的最后一行。