Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了linux – 以特定顺序从文件中选择某些行的简便方法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我有一个文本文件,有很多行.我也有一定数量的线要打印出来,按一定的顺序排列.比方说,例如,“5,3,10,6”.按此顺序. 这样做有一些简单和“规范”的方式吗? (使用“标准”Linux工具和bash) 当我尝试这个问题的答案时 Bash tool to get nth line from a file 它总是按照文件中的顺序打印行. 如果你的文件不是太大,一个相当有效的方法是在内存中读取所有内容
我有一个文本文件,有很多行.我也有一定数量的线要打印出来,按一定的顺序排列.比方说,例如,“5,3,10,6”.按此顺序.

这样做有一些简单和“规范”的方式吗? (使用“标准”Linux工具和bash)

当我尝试这个问题的答案时

Bash tool to get nth line from a file

它总是按照文件中的顺序打印行.

@H_618_29@解决方法
如果你的文件不是太大,一个相当有效的方法是在内存中读取所有内容,在数组中,每个字段使用mapfile一行(这是Bash≥4内置):

@H_703_34@mapfile -t array < file.txt

然后,您可以按任何顺序回显所需的所有行,

printf '%s\n' "${arraY[4]}" "${array[2]}" "${arraY[9]}" "${array[5]}"

打印第5,6行.现在你会觉得数组字段以0开头有点尴尬,所以你必须抵消你的数字.使用mapfile的-O选项可以很容易地解决这个问题:

@H_703_34@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() {
    # $1 is filename
    # $2,... are the lines to print
    local i array
    mapfile -t -O 1 array < "$1" || return 1
    shift
    for i; do printf '%s\n' "${arraY[i]}"; done
}

然后你可以用它作为

printlinesof file.txt 5 3 10 6

如果你还想处理stdin:

printlinesof() {
    # $1 is filename or - for stdin
    # $2,... are the lines to print
    local i array file=$1
    [[ $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 – 以特定顺序从文件中选择某些行的简便方法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。