有没有一种“规范”的方法?我一直在使用head-n|tail-1来完成这个任务,但我一直在想是否有一个Bash工具专门从文件中提取一行(或一系列行)。
我所说的“规范”是指一个主要功能就是这样做的程序。
有没有一种“规范”的方法?我一直在使用head-n|tail-1来完成这个任务,但我一直在想是否有一个Bash工具专门从文件中提取一行(或一系列行)。
我所说的“规范”是指一个主要功能就是这样做的程序。
当前回答
在查看了顶部答案和基准之后,我实现了一个小助手函数:
function nth {
if (( ${#} < 1 || ${#} > 2 )); then
echo -e "usage: $0 \e[4mline\e[0m [\e[4mfile\e[0m]"
return 1
fi
if (( ${#} > 1 )); then
sed "$1q;d" $2
else
sed "$1q;d"
fi
}
基本上,您可以以两种方式使用它:
nth 42 myfile.txt
do_stuff | nth 42
其他回答
对于一个巨大的文件来说,头部和尾部的管道会很慢。我建议您这样做:
sed 'NUMq;d' file
其中NUM是要打印的行数;例如,sed’10q;d'文件以打印文件的第10行。
说明:
当行号为NUM时,NUMq将立即退出。
d将删除该行而不是打印该行;这在最后一行被禁止,因为q会导致退出时跳过脚本的其余部分。
如果变量中有NUM,则需要使用双引号而不是单引号:
sed "${NUM}q;d" file
sed -n '2p' < file.txt
将打印第二行
sed -n '2011p' < file.txt
2011线
sed -n '10,33p' < file.txt
第10行到第33行
sed -n '1p;3p' < file.txt
第1和第3行
等等
对于使用sed添加行,您可以选中此项:
sed:在某个位置插入一行
这个问题被标记为Bash,下面是Bash(≥4)的方法:使用带有-s(跳过)和-n(计数)选项的mapfile。
如果需要获取文件文件的第42行:
mapfile -s 41 -n 1 ary < file
此时,您将得到一个数组ary,其中的字段包含文件行(包括尾部换行符),我们跳过了前41行(-s 41),并在读取一行(-n 1)后停止。这真的是第42行。要打印出来:
printf '%s' "${ary[0]}"
如果您需要一系列行,请说出范围42–666(含),并说您不想自己计算,然后将它们打印在标准输出上:
mapfile -s $((42-1)) -n $((666-42+1)) ary < file
printf '%s' "${ary[@]}"
如果您也需要处理这些行,那么存储尾随换行符并不太方便。在这种情况下,使用-t选项(trim):
mapfile -t -s $((42-1)) -n $((666-42+1)) ary < file
# do stuff
printf '%s\n' "${ary[@]}"
你可以让一个函数为你做这件事:
print_file_range() {
# $1-$2 is the range of file $3 to be printed to stdout
local ary
mapfile -s $(($1-1)) -n $(($2-$1+1)) ary < "$3"
printf '%s' "${ary[@]}"
}
没有外部命令,只有Bash内置命令!
如果有多行由\n分隔(通常为新行)。您也可以使用“cut”:
echo "$data" | cut -f2 -d$'\n'
您将从文件中获得第二行-f3给你第三行。
保存两次按键,不使用括号打印第N行:
sed -n Np <fileName>
^ ^
\ \___ 'p' for printing
\______ '-n' for not printing by default
例如,要打印第100行:
sed -n 100p foo.txt