Unix 如何使用SED/AWK将文本文件中的第一行与最后一行交换

Unix 如何使用SED/AWK将文本文件中的第一行与最后一行交换,unix,awk,sed,Unix,Awk,Sed,我试图在unix中用文本文件中的最后一行替换第一行 文件有: line1 line2 line3 line4 line5 line6 我想要这样: line6 line2 line3 line4 line5 line1 我使用的是sed-n-e'1s/^.*$/$p'文件。这并没有发生。EDIT2:根据Ed sir的评论,在此处添加此解决方案,如果第二行为空,则更适合,它也会起作用 awk 'NR==1{first=$0;next} NR>2{val=val prev ORS} {p

我试图在unix中用文本文件中的最后一行替换第一行 文件有:

line1
line2
line3
line4
line5
line6
我想要这样:

line6 
line2
line3
line4
line5
line1
我使用的是
sed-n-e'1s/^.*$/$p'文件
。这并没有发生。

EDIT2:根据Ed sir的评论,在此处添加此解决方案,如果第二行为空,则更适合,它也会起作用

awk 'NR==1{first=$0;next} NR>2{val=val prev ORS} {prev=$0} END{print prev ORS val first}  Input_file

编辑:仅交换以下第一行和最后一行可能会对您有所帮助(考虑到您的输入文件与示例所示相同)

说明:

请您尝试以下内容,并让我知道这是否有助于您

awk -v from=1 -v to=6 'FNR==from{source=$0;next} FNR==to{target=$0;next} {val=val?val ORS $0:$0} END{print target ORS val ORS source}' Input_file

在sed中,您需要进行两次传递;用ed来代替可能更有意义。然后我们只需要两个move命令-将最后一行移到第1行之后,然后将第一行移到末尾:

$m1
1米$
演示
#/bin/bash
设置-euo管道故障
#创建我们的输入文件
文件=$(mktemp)
陷阱“rm”$file”退出

cat>“$file”以防一行混音,
sed

$ FIRST=$(head -1 file.txt) LAST=$(tail -1 file.txt) \
sed "1 s/^.*$/${LAST}/" file.txt | sed "$ s/^.*$/${FIRST}/"

对于非常大的文件,您可能会对双通道感兴趣:

awk '(NR!=FNR){print (FNR==1 ? t : (FNR==c ? h : $0) ); next }
     (NR==1){h=$0}{t=$0;c=NR}' file file
这可能适用于您(GNU-sed):

将整个文件复制到保留空间(HS)中,在最后一行之后,交换到HS,将文件拆分为第一行、中间行和最后一行,并替换第一行和最后一行

两次通过的替代解决方案:

sed -n '1s/.*/$c&/p;$s/.*/1c&/p' file | sed -f - file
sed -E '1h;1d;:a;N;$!ba;s/(.*)\n(.*)/\2\n\1/;G' file
创建一个sed脚本,将第一行更改为最后一行,将最后一行更改为第一行

使用cat、head、tail和sed的另一种解决方案:

cat <(tail -1 file) <(sed '1d;$d' file) <(head -1 file)
使用:


对不起,行号不知道,我只是给第6行举了一个例子谢谢你的建议。最后一行有,基于此,我们需要交换第一行。再次感谢!!我是否应该放弃并停止提醒您,在某些AWK的某些上下文中,未细化的三元表达式会导致语法错误?此外,END部分中$0的值是每个POSIX未定义的行为,因此将根据您正在运行的awk版本产生不同的输出-最后使用prev而不是$0。@EdMorton,我真的很抱歉,我现在将尝试修复它:(@RavinderSingh13请不要这样认为,我当然不会给你下达命令,也不会期望你服从我,我只是想帮助你成为一名更好的awk编剧。当然,你是否需要我的建议完全取决于你,如果不是的话,请告诉我退后,我会退后,一点问题也没有。我是你的同龄人,不是你的老板,我只是哈哈我对使用awk有更多的经验,仅此而已。我不知道文件的长度,这意味着行数未知,但需要使用sed/awk将该文件的第一行替换为最后一行。Try
first=“$(head-n1 file1)”;last=“$(tail-n1file1)”;echo-e$“$last”“\n$(cat file1 | tail-n+2 | head-n-1)”$“\n$first”>file2
@Downvoter:这个答案真的那么糟糕吗?我应该做些什么来改进它?
sed 'H;$!d;x;s/\n\([^\n]*\)\(\n.*\n\)\(.*\)/\3\2\1/' file
sed -n '1s/.*/$c&/p;$s/.*/1c&/p' file | sed -f - file
cat <(tail -1 file) <(sed '1d;$d' file) <(head -1 file)
sed -E '1h;1d;:a;N;$!ba;s/(.*)\n(.*)/\2\n\1/;G' file
f=file
{ tail -1 $f ; tail -n +2 $f | head -n -1 ; head -1 $f ; } | sponge $f