在 Unix 中的最后一个单词后附加文件文本

在 Unix 中的最后一个单词后附加文件文本

我想在 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 的最后一行。

相关内容