如何消除文件中的所有奇数行但使用单个衬管保留第1行?

时间:2016-11-24 13:37:47

标签: linux bash

我有一系列具有以下结构的文件

Header1
Data2
Garbage3
Data4
Garbage5
Data6

我想保留标题(line1)和数据(偶数行),并丢弃垃圾(奇数行除1)。我找到了一个丑陋的解决方案:

echo $(head -n 1 file.txt) $(awk 'NR%2==0' file.txt) | tr " " "\n" > file.tmp #I cannot rewrite file.txt directly
mv file.tmp file.txt

有没有办法优雅地在一行中做到这一点?注意:我不想打印到STDOUT,我想将file.txt替换为自己的干净版本吗?

3 个答案:

答案 0 :(得分:2)

awk 'NR%2==0||NR==1' odd
Header1
Data2
Data4
Data6

这将根据两个条件打印行:

  1. 打印第1行。或者
  2. 打印任何可被2整除的行。
  3. 要对文件进行更改:

    awk 'NR%2==0||NR==1' odd >odd.tmp && mv odd.tmp odd
    

答案 1 :(得分:1)

使用下面的命令,它将在文件内部进行。

sed -ie '1p;1~2d' filename.txt

示例:

$ cat sample.txt
Header1
Data2
Garbage3
Data4
Garbage5
Data6
$
$ sed -ie '1p;1~2d' sample.txt
$
$
$ cat sample.txt
Header1
Data2
Data4
Data6
$

答案 2 :(得分:0)

sed(gnu sed)单行应该有效:

sed -n '1{p;n};p;n' file

OR

sed -n '1p;0~2p' file

用你的例子,两个输出:

Header1
Data2
Data4
Data6