如何删除串联文本文件中与标题匹配的所有行,而不删除标题? [重击]

时间:2019-01-22 16:59:31

标签: bash shell unix

很抱歉,如果这个问题已经存在。我有一个串联的文本文件,如下所示:

#Chr    start   end ID  GTEX-Q2AG   GTEX-NPJ8
1   1   764484  783034  1:764484:783034:clu_2500_NA 0.66666024153854    -0.194766358934969
2   1   764484  787307  1:764484:787307:clu_2500_NA -0.602342191830433  0.24773430748199
3   1   880180  880422  1:880180:880422:clu_2501_NA -0.211378452591182  2.02508282380949
4   1   880180  880437  1:880180:880437:clu_2501_NA 0.231916912049866   -2.20305649485074
5   1   889462  891303  1:889462:891303:clu_2502_NA -2.3215482460681    0.849095194607155
6   1   889903  891303  1:889903:891303:clu_2502_NA 2.13353943689806    -0.920181808417383
7   1   899547  899729  1:899547:899729:clu_2503_NA 0.990822909478346   0.758143648905368
8   1   899560  899729  1:899560:899729:clu_2503_NA -0.938514081703866  -0.543217522714283
9   1   986217  986412  1:986217:986412:clu_2504_NA -0.851041440248378  0.682551011244202

第一行#Chr start end ID GTEX-Q2AG GTEX-NPJ8是标题,并且由于我串联了多个相似的文件,因此在整个文件中它会多次出现。我想删除文本中出现的标题的每个实例,而不删除第一个标题

奖金我实际上也需要帮助,并且希望避免发布另一个堆栈溢出问题。我的数据的第一列由R生成,代表行号。我希望它们全部删除而不删除#Chr。列太多了,这是一个问题。

此问题与我建议的问题有所不同,因为存在上述其他问题,也因为您不必使用正则表达式来解决此问题。

4 个答案:

答案 0 :(得分:1)

以下AWK脚本删除了与第一行完全相同的所有行。

awk '{ if($0 != header) { print; } if(header == "") { header=$0; } }' inputfile > outputfile

它将打印第一行,因为header的初始值为空字符串。然后它将第一行存储在header中,因为它是空的。

此后,它将仅打印不等于header中已存储的第一行的行。保存标头后,第二个if将始终为false。

注意:如果文件以空行开头,则这些空行将被删除。

要删除第一个数字列,可以使用

sed 's/^[0-9][0-9]*[ \t]*//' inputfile > outputfile

您可以将两个命令组合到管道中

awk '{ if($0 != header) { print; } if(header == "") { header=$0; } }' inputfile | sed 's/^[0-9][0-9]*[ \t]*//' > outputfile

答案 1 :(得分:1)

也许有帮助:

  1. 删除所有标题
  2. 删除第一列
  3. 添加第一个标题
cat foo.txt
#Chr    start   end ID  GTEX-Q2AG   GTEX-NPJ8
1   1   764484  783034  1:764484:783034:clu
#Chr    start   end ID  GTEX-Q2AG   GTEX-NPJ8
2   1   764484  783034  1:764484:783034:clu
#Chr    start   end ID  GTEX-Q2AG   GTEX-NPJ8
3   1   764484  783034  1:764484:783034:clu

sed '/#Chr    start   end ID  GTEX-Q2AG   GTEX-NPJ8/d' foo.txt | awk '{$1 = ""; print $0 }' | sed '1i #Chr    start   end ID  GTEX-Q2AG   GTEX-NPJ8'

#Chr    start   end ID  GTEX-Q2AG   GTEX-NPJ8
 1 764484 783034 1:764484:783034:clu
 1 764484 783034 1:764484:783034:clu
 1 764484 783034 1:764484:783034:clu

答案 2 :(得分:0)

我会

awk 'NR == 1 {header = $0; print} $0 != header' file

答案 3 :(得分:0)

使用sed

sed '2,${/HEADER/d}' input.txt > output.txt

命令说明:

  • 从第2行开始:2,
  • 搜索与“ HEADER” /HEADER匹配的任何行
  • 删除/d