为什么我的while循环跳过文件的第一行

时间:2019-06-26 18:44:37

标签: bash file loops

我有一个包含64行的文件。我想将每行的第一个和第五个单词提取到一个新文件中,所以我有一个while循环正在运行以实现此目的。但是,我的输出文件只有63行,经过检查,我发现第一行丢失了。这是我的代码:

tail -n +9 table.$1 > tab.$1

while read -r
do
awk -v OFS='\t' '{print $1, $5}' > rtable.$1

done < tab.$1

开始时的尾巴是从一个较大的文件中获得我想要的64行。但是,这不是问题,因为tab。$ 1文件很好,但rtable。$ 1文件较短。

2 个答案:

答案 0 :(得分:3)

输入文件的第一行被read -r占用。然后,awk处理所有剩余的行并将其写入rtable.$1

while循环的下一个迭代然后结束,因为read -r不再需要读取任何内容。也是一件好事,因为否则awk > rtable.$1将再次运行并覆盖您的输出文件。

解决方案:只需移除循环即可。

awk -v OFS='\t' '{print $1, $5}' > rtable.$1 < tab.$1

您甚至可以完全摆脱tab.$1

tail -n +9 table.$1 | awk -v OFS='\t' '{print $1, $5}' > rtable.$1

答案 1 :(得分:1)

@melpomene击败了我,但我要添加解释,以至于评论太久了。

  • awk默认情况下,读取标准输入的全部内容。此处就是这种情况,因为您的脚本没有给awk输入文件名。
  • while ... done < tab.$1的重定向不仅将tab.$1,而且while中的所有内容都将while连接到标准输入。因此,在readawk之间,只有其中一个可以获取每一行输入。
  • 就像@melpomene所说的那样,read占据一行,然后awk拉剩下的(默认行为)。