首页 > 解决方案 > Bash 循环只读取最后一行

问题描述

我在尝试使用 while 循环和awk.

这是我的数据结构:

Identifiers:BioSample:SAMD00019077
Identifiers:BioSample:SAMD00019076
Identifiers:BioSample:SAMD00019075
Identifiers:BioSample:SAMD00019074
Identifiers:BioSample:SAMD00019073
Identifiers:BioSample:SAMD00019072
Identifiers:BioSample:SAMD00019071;SRA:DRS051563
Identifiers:BioSample:SAMD00019070;SRA:DRS051562
Identifiers:BioSample:SAMD00019069;SRA:DRS051561
...
Identifiers:BioSample:SAMD00019005;SRA:DRS051497
Identifiers:BioSample:SAMD00015713;SRA:DRS012785

我想要得到的是BioSample ID,就像SAMD00019077

我试过的脚本:

  1. while read line ; do echo $line | awk -F':' '{print $3}' > 1.tmp2 ; done < 1.tmp
  2. for line in猫 1.tmp; do echo $line | awk -F':' '{print $3}' > 1.tmp2 ; done
  3. for line in猫 1.tmp; do echo $line | awk -F: '{print $3 > "1.tmp2"}' ; done

他们只给出Biosample ID了最后一行:

$ while read line ; do echo $line | 
  awk -F':' '{print $3}' > 1.tmp2 ; done < 1.tmp
$ head 1.tmp2
SAMD00015713;SRA

我在这里阅读了这些帖子,看起来我的问题与stdin,stdoutstderr.

bash read循环只读取输入变量的第一行

bash while 循环只读取一行

我试过的解决方案,它给出了 1 行的结果

$ exec 3<&1
$ exec 1<&2
$ while read line ; do echo $line |  
  awk -F':' '{print $3}' > 1.tmp2 ; done< 1.tmp
$ head 1.tmp2
SAMD00015713;SRA
$ exec 1<&3 3<&-

我也尝试exec < 1.tmp将文件定向到stdin但它导致错误。

我发现这些脚本对我来说效果很好。但我真的很想知道为什么我上面尝试的脚本失败了。

cat 1.tmp | awk -F: '{print $3}' | head

awk -F: '{print $3}' 1.tmp | head

标签: linuxbashshellfor-loopawk

解决方案


由于您循环遍历 1.tmp 中的每一行,因此使用>> 1.tmp2以附加模式重定向输出,而不是> 1.tmp2继续替换前一个条目。


推荐阅读