我有一个包含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文件较短。
答案 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
连接到标准输入。因此,在read
和awk
之间,只有其中一个可以获取每一行输入。read
占据一行,然后awk
拉剩下的(默认行为)。