想知道你是否可以帮助我。 我想要做的是将文件的最后一行移动到文件的第二行。
文件记录正在动态变化,因此最后一行未使用行号进行硬编码。
当前$FILE
输出:
echo -e "\n$CALC"
产生上述文件后我想要实现的是以下输出:
echo -e "\n$CALC"
$CALC
抓取文件的输出并执行wc -l
。
状态使用env $CALC
计算文件中的记录数,该$CALC
是在生成当前文件后设置的。显然,如果我在文件'wc'
中记录文件数据之前移动sed '$d' < $FILE > tmp
mv tmp $FILE
将失败。
有没有办法以某种方式从生成的$ FILE输出移动最后一行并将其移动到第二行?
我想出了一些会删除最后一个文件(需要将最后一行复制到第二行后完成)
{{1}}
任何提示答案赞赏
答案 0 :(得分:0)
这个awk oneliner适合您的需要:
awk '{a[NR]=$0}END{for(x=1;x<NR;x++){if(x==2)print a[NR];print a[x]}}' file
如果您想将最后一行移到第二行以外的某行,您只需将x==2
更改为其他值即可。
试验:
kent$ seq 5|awk '{a[NR]=$0}END{for(x=1;x<NR;x++){if(x==2)print a[NR];print a[x]}}'
1
5
2
3
4
答案 1 :(得分:0)
您可以像这样使用sed
:
last=$(tail -1 file)
sed -i.bak -e "2s/^/$last\n/" -e '$d' file
---FOOTER---
status (no of records in data) echo -e "\n$CALC"
data
答案 2 :(得分:0)
(head -1 input; tail -1 input; tail -n +2 input | head -n -1) > output
我确信有更好的方法。
答案 3 :(得分:0)
使用数组的纯Bash解决方案:
mapfile array < input
printf "%s" "${array[0]}" "${array[ -1]}" "${array[@]:1:${#array[@]}-2}"
答案 4 :(得分:0)
使用 sed 的存储空间,我找到了以下单行解决方案:
sed '$!H;$!d;$p;$g' < file >
指令是:将除最后一行之外的所有行放入sed的保持模式,然后删除它们,然后打印最后一行,并将保持空间的内容复制到模式空间。
尽管有一个小缺点,这段代码会在两个打印输出后面插入一个空行(LF-CR 标志似乎出现在该行的开头)。
然而,这可以通过额外的脏重定向来解决:
sed '$!H;$!d;$p;$g' < file > | sed '/^$/d'
欢迎提出任何更正、评论或建议。