12

我正在尝试从 bash 中的特定行开始逐行读取文件。我已经使用 while 命令通过增加计数来读取文件的每一行。我可以让它从特定的行开始吗?

let count=0
declare -a ARRAY

while read LINE; do
ARRAY[$count]=$LINE 
vech=${ARRAY[$count]}
    if [...blah ..]
     then
    ...blah..
    fi 
sleep 2 
((count++)) 
done < filec.c 

欢迎任何形式的建议或算法帮助。

编辑:我正在尝试将行号作为变量传递。我正在寻找特定模式,如果找到,应该从模式开始传递行号。

4

5 回答 5

16

我会使用sed's地址从特定行号开始并打印到文件末尾:

lineNumber=10
sed -n "$lineNumber"',$p' |
while read line; do
  # do stuff
done

要么,或者按照弗雷德里克的建议,使用awk

lineNumber=10
awk "NR > $lineNumber" |
while read line; do
  # do stuff
done
于 2012-06-19T15:22:46.457 回答
7

这样的事情呢?

while read -r line
do
    echo "$line"
done < <(tail -n +number file.name)

它与 POSIX 不兼容,但请尝试使用您的 Bash。当然,在 while 循环中使用 $line 做你想做的事。
PS:用你想要的数字行更改数字,用文件名更改文件名。

于 2012-06-19T14:34:34.353 回答
2

许多方法中的一些:http: //mywiki.wooledge.org/BashFAQ/011

亲自:

printf '%s\n' {1..6} | { mapfile -ts 3 x; declare -p x; }                  

另外,不要使用全部大写的变量名。

于 2012-06-19T13:58:56.107 回答
2

只保留一个柜台。要打印某一行之后的所有行,您可以这样做:

#!/bin/bash

cnt=0
while read LINE
do
    if [ "$cnt" -gt 5 ];
    then
        echo $LINE
    fi
    cnt=$((cnt+1))
done < lines.txt

或者,为什么不使用 awk:

awk 'NR>5' lines.txt 
于 2012-06-19T14:11:12.437 回答
0

只需阅读一定数量的行,直到你想要的数量,然后开始你的逻辑来阅读其余的。

没有办法节省“文本”文件,你不能在不实际阅读的情况下跳过行。这些行由 0x0a 分隔并且长度可变。因此,必须扫描和计数每个分隔符以达到某个“行号”。有些噱头让您认为您没有阅读它们,但您确实阅读了它们。

于 2012-06-19T20:21:44.147 回答