通过shell脚本转到文本文件的特定行

时间:2016-02-15 17:56:21

标签: bash shell

我有两个文本文件。这两个文件的结构是一样的。我有一个while循环,它同时从这两个文本文件中读取。但是这两个文件都不需要,前4行。所以我需要的是,在我的程序开始时,两个头将跳转到这两个文件的第4行,然后开始读取我的while循环。 这是我目前的代码

while read compareFile1 <&3 && read compareFile2 <&4; do
echo $compareFile1
echo $compareFile2 
done 3<test1.txt 4<test2.txt

这是我的示例文件..

=== Predictions on test data ===

    inst#     actual  predicted error prediction (id)
        1 1:positive 1:positive       0.774 (10001996.txt)
        2 1:positive 2:negative   +   0.889 (10003432.txt)
        3 1:positive 1:positive       1 (10003865.txt)
        4 1:positive 1:positive       0.999 (10004065.txt)
        5 1:positive 1:positive       0.991 (10004266.txt)
        6 1:positive 1:positive       0.999 (10006157.txt)
        7 1:positive 1:positive       0.869 (10007003.txt)
        8 1:positive 2:negative   +   1 (10008447.txt)
        9 1:positive 1:positive       0.998 (10009702.txt)
       10 1:positive 1:positive       0.994 (10011072.txt)

我怎么能用bash做到这一点?我正在使用mac。感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用tail实用程序。默认情况下,它输出文件的最后10行,但它也有一些非常有用的参数。要跳过前X行,请使用-n+X

示例:

 tail -n+5 myfile.txt

将从第5行输出整个文件(跳过前4行)。

但在你的情况下,你可以简单地增加一个变量来开始第4行的处理。例如:

l=0 
while read compareFile1 <&3 && read compareFile2 <&4; do
  if [[ $l < 4 ]]; then 
     l=$((l+1)); 
  else
     # do your processing here
     echo $compareFile1
     echo $compareFile2 
  fi  
done 3<test1.txt 4<test2.txt

答案 1 :(得分:0)

这是另一种选择,它避免在shell循环中读取这两个文件:

nl File1.txt | paste - File2.txt | sed -n '5,$ p'

它在第一列中生成行号(通过nl),然后是第一个文件的内容,后跟第二个文件的内容。 sed命令删除前四行。

而不是sed,您可以插入awk并访问文件中的字段。

根据文件大小,这可能会更快。

答案 2 :(得分:-1)

要读取除myfile的前4行以外的所有行:     tail -n +4 myfile