linux – 以特定顺序从文件中选择某些行的简便方法
发布时间:2020-12-14 01:15:40 所属栏目: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 它总是按照文件中的顺序打印行. 解决方法
如果你的文件不是太大,一个相当有效的方法是在内存中读取所有内容,在数组中,每个字段使用mapfile一行(这是Bash≥4内置):
mapfile -t array < file.txt 然后,您可以按任何顺序回显所需的所有行, printf '%sn' "${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 '%sn' "${array[5]}" "${array[3]}" "${array[10]}" "${array[6]}" 最后,您想为此创建一个包装器函数: printlines() { local i for i; do printf '%sn' "${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 '%sn' "${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 '%sn' "${array[i]}"; done } 以便 printf '%sn' {a..z} | printlinesof - 5 3 10 6 也会工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |