linux - 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
。
我试过的脚本:
while read line ; do echo $line | awk -F':' '{print $3}' > 1.tmp2 ; done < 1.tmp
for line in
猫 1.tmp; do echo $line | awk -F':' '{print $3}' > 1.tmp2 ; done
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
,stdout
和stderr
.
我试过的解决方案,它给出了 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
解决方案
由于您循环遍历 1.tmp 中的每一行,因此使用>> 1.tmp2
以附加模式重定向输出,而不是> 1.tmp2
继续替换前一个条目。
推荐阅读
- node.js - 这个错误是什么意思?“DeprecationWarning:OutgoingMessage.prototype._headers 已弃用”以及如何在 nodejs12 中复制它
- c# - C# 生成 SSRS 报告“reportservice2005 异常”
- javascript - 使用“CanvasRenderingContext2D.putImageData()”时出现白屏,即使数据似乎包含图像
- c# - 如何从文件存储中异步下载数百万个文件?
- php - 为什么当 nl2br 工作正常时 PHP_EOL 不工作
- azure-ad-b2c - 只有“电子邮件”字段可以通过“id_token_hint”传递给 B2C 自定义策略
- php - Google 日历 API 保持帐户连接
- c# - 如何使用 EditForm 将必填字段的日期默认为今天的日期?
- solr - 使用 curl 创建 solr 集合
- javascript - forEach 与 Firebase 调用