将第一行复制到文件中的最后一行

时间:2018-02-17 10:05:05

标签: linux bash awk

此处的目的是将文件中的第一行复制到最后一行

这里是输入文件

335418.75,2392631.25,36091,38466,1
335418.75,2392643.75,36092,38466,1
335418.75,2392656.25,36093,38466,1
335418.75,2392668.75,36094,38466,1
335418.75,2392681.25,36095,38466,1
335418.75,2392693.75,36096,38466,1
335418.75,2392706.25,36097,38466,1
335418.75,2392718.75,36098,38466,1
335418.75,2392731.25,36099,38466,1

使用以下代码,我得到了所需的输出。还有其他简单的选择吗?

  awk 'NR==1 {print}' FF1-1.csv > tmp1
  cat FF1-1.csv tmp1

输出所需

335418.75,2392631.25,36091,38466,1
335418.75,2392643.75,36092,38466,1
335418.75,2392656.25,36093,38466,1
335418.75,2392668.75,36094,38466,1
335418.75,2392681.25,36095,38466,1
335418.75,2392693.75,36096,38466,1
335418.75,2392706.25,36097,38466,1
335418.75,2392718.75,36098,38466,1
335418.75,2392731.25,36099,38466,1
335418.75,2392631.25,36091,38466,1

提前致谢。

5 个答案:

答案 0 :(得分:5)

将行保存在变量中并使用END

打印到最后
$ seq 5 | awk 'NR==1{fl=$0} 1; END{print fl}'
1
2
3
4
5
1

答案 1 :(得分:4)

head可以生成与awk相同的输出,因此您可以cat代替。{/ p>

您可以使用process substitution来避免临时文件。

cat FF1-1.csv <(head -n 1 FF1-1.csv)

正如Sundeep所提到的,如果流程替换不可用,您可以简单地cat该文件,然后按顺序head获取相同的结果,将两者放在子shell中你需要重定向输出:

(cat FF1-1.csv; head -n1 FF1-1.csv) > dest

另一种方法是将head的输出管道传输到cat,然后用-引用它,cat表示标准输入:

head -1 FF1-1.csv | cat FF1-1.csv -

答案 2 :(得分:2)

使用GNU sed:

seq 1 5 | sed '1h;$G'

输出:

1
2
3
4
5
1
  

1h:复制第一行以保留空格

     

$G:在最后一行为模式空间追加保留空间

答案 3 :(得分:2)

如果要覆盖现有的正常解决方案,则可能会失败:请勿写入正在使用的文件。 编辑file的解决方案是:

printf "%s\n" 1y $ x w q | ed -s file > /dev/null

说明: printf将有助于输入新行中的所有命令 1y会将第一行放入buf中 $移至最后一行 x会粘贴buf的内容。
w会写出结果。 q将退出编辑器。 ed是执行所有工作的编辑 -s正在抑制诊断 file是您的输入文件。 > /dev/null正在抑制屏幕输出。

答案 4 :(得分:1)

以下解决方案也可能有所帮助:

解决方案第一: 只需在awk使用RSFS(不使用变量),只需使用awk -v RS="" -v FS="\n" '{print $0 ORS $1}' Input_file

cat

解决方案第二: 使用headcat Input_file && head -n1 Input_file

@Suite.SuiteClasses(...)