最后一行到第一行

时间:2014-02-19 09:46:24

标签: bash

想知道你是否可以帮助我。 我想要做的是将文件的最后一行移动到文件的第二行。

文件记录正在动态变化,因此最后一行未使用行号进行硬编码。

当前$FILE输出:

  1. --- --- FOOTER
  2. 数据
  3. 状态(数据中没有记录)echo -e "\n$CALC"
  4. 产生上述文件后我想要实现的是以下输出:

    1. --- --- FOOTER
    2. 状态(数据中没有记录)echo -e "\n$CALC"
    3. 数据
    4. $CALC抓取文件的输出并执行wc -l

      状态使用env $CALC计算文件中的记录数,该$CALC是在生成当前文件后设置的。显然,如果我在文件'wc'中记录文件数据之前移动sed '$d' < $FILE > tmp mv tmp $FILE 将失败。

      有没有办法以某种方式从生成的$ FILE输出移动最后一行并将其移动到第二行?

      我想出了一些会删除最后一个文件(需要将最后一行复制到第二行后完成)

      {{1}}

      任何提示答案赞赏

5 个答案:

答案 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'

欢迎提出任何更正、评论或建议。