将行范围写入文件(1 到 N)Bash、Awk 或 Sed 脚本

将行范围写入文件(1 到 N)Bash、Awk 或 Sed 脚本

I've already extracted the line numbers needed from the input file (i.e 1 through N). I now need to be able to use the input file with this 1-through-N to output to a new file. The pattern matching has already occurred in a previous function which extracted the line numbers from the input file. Now I need to take this range of numbers using the input file and output that range into a new file. I don't need to do any pattern matching, just need to do 1-through-N to a new file.

我目前正在使用 bash 脚本和 Awk 提取必要的信息以从输入文件生成范围数据。现在我需要承受这种愤怒并从 1 到 N 创建一个新文件(使用输入文件)。

我试过了

sed -i '1,'"$N" input.txt > input.log

使用我的输入文件 input.txt 并输出到 input.log 文件从 1 到 N,但出现以下错误:

sed: -e expression #1, char 3: missing command

上面的代码行位于 bash 脚本内。

答案1

head似乎是这项工作的最佳工具:

head -n "$N" input.txt > input.log

使用 时sed,需要指定一个命令;根据您的方法,这将是p命令和-n选项,因此默认情况下它不会打印模式空间:

sed -n "1,${N}p" input.txt > input.log

sed "$N q" input.txt > input.log

会更有效,只读取第一N行并停止(这也是所做head的)而不是读取整个文件(这也是所做的sed "1,${N}p")。

N这些方法仅在大于或等于 1 时产生相同的输出;如果它小于 1,行为将会有所不同。

答案2

sed "${N}q" file

做你需要做的事?

答案3

对于从 M 到 N 的线路(假设 M <= N):

head -n N input.txt | tail -n $(( N - M + 1))

或者

cat input.txt | head -n N | tail -n $(( N - M + 1))

后一种形式可用于任何流

答案4

使用双引号“无引号”使事情变得更简单:

head -$N ex
sed "$N q" ex
sed -n "1,$N p" ex
awk "NR <= $N" ex
perl -ne "print if $. <= $N" ex
grep -m $N . ex

相关内容