这样做有一些简单和“规范”的方式吗? (使用“标准”Linux工具和bash)
当我尝试这个问题的答案时
Bash tool to get nth line from a file
它总是按照文件中的顺序打印行.
解决方法 如果你的文件不是太大,一个相当有效的方法是在内存中读取所有内容,在数组中,每个字段使用mapfile一行(这是Bash≥4内置):mapfile -t array < file.txt
然后,您可以按任何顺序回显所需的所有行,
printf '%s\n' "${array[4]}" "${array[2]}" "${array[9]}" "${array[5]}"
打印第5,6行.现在你会觉得数组字段以0开头有点尴尬,所以你必须抵消你的数字.使用mapfile的-O选项可以很容易地解决这个问题:
mapfile -t -O 1 array < file.txt
这将开始分配索引1处的数组,以便您可以将第5,10和6行打印为:
printf '%s\n' "${array[5]}" "${array[3]}" "${array[10]}" "${array[6]}"
最后,您想为此创建一个包装器函数:
printlines() { local i for i; do printf '%s\n' "${array[i]}"; done}
所以你可以说:
printlines 5 3 10 6
它都是纯粹的Bash,没有外部工具!
正如@glennjackmann在评论中建议你可以让辅助函数也负责读取文件(作为参数传递):
printlinesof() { # is filename # ,... are the lines to print local i array mapfile -t -O 1 array < "" || return 1 shift for i; do printf '%s\n' "${array[i]}"; done}
然后你可以用它作为:
printlinesof file.txt 5 3 10 6
如果你还想处理stdin:
printlinesof() { # is filename or - for stdin # ,... are the lines to print local i array file= [[ $file = - ]] && file=/dev/stdin mapfile -t -O 1 array < "$file" || return 1 shift for i; do printf '%s\n' "${array[i]}"; done}
以便
printf '%s\n' {a..z} | printlinesof - 5 3 10 6
也会工作.
总结以上是内存溢出为你收集整理的linux – 以特定顺序从文件中选择某些行的简便方法全部内容,希望文章能够帮你解决linux – 以特定顺序从文件中选择某些行的简便方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)