取文本文件中的第 n 列
- 2024-10-29 08:35:00
- admin 原创
- 43
问题描述:
我有一个文本文件:
1 Q0 1657 1 19.6117 Exp
1 Q0 1410 2 18.8302 Exp
2 Q0 3078 1 18.6695 Exp
2 Q0 2434 2 14.0508 Exp
2 Q0 3129 3 13.5495 Exp
我想像这样取出每一行的第二和第四个单词:
1657 19.6117
1410 18.8302
3078 18.6695
2434 14.0508
3129 13.5495
我正在使用这个代码:
nol=$(cat "/path/of/my/text" | wc -l)
x=1
while [ $x -le "$nol" ]
do
line=($(sed -n "$x"p /path/of/my/text)
echo ""${line[1]}" "${line[3]}"" >> out.txt
x=$(( $x + 1 ))
done
它可以工作,但是非常复杂并且处理长文本文件需要很长时间。
有没有更简单的方法可以做到这一点?
解决方案 1:
据我所知:
cat filename.txt | awk '{ print $2 $4 }'
或者,正如评论中提到的:
awk '{ print $2 $4 }' filename.txt
解决方案 2:
您可以使用以下cut
命令:
cut -d' ' -f3,5 < datafile.txt
印刷
1657 19.6117
1410 18.8302
3078 18.6695
2434 14.0508
3129 13.5495
这
-d' '
- 意思是,用作space
分隔符-f3,5
- 取出并打印第 3 列和第 5 列
作为纯 shell 解决方案,对于大文件来说,速度cut
要快得多。如果您的文件由多个空格分隔,您可以先将其删除,例如:
sed 's/[ ][ ]*/ /g' < datafile.txt | cut -d' ' -f3,5
其中 (gnu) sed 将用单个替换任何tab
或字符。space
`space`
对于变体-这里也有一个 perl 解决方案:
perl -lanE 'say "$F[2] $F[4]"' < datafile.txt
解决方案 3:
为了完整起见:
while read -r _ _ one _ two _; do
echo "$one $two"
done < file.txt
_
也可以使用任意变量(例如)junk
。重点只是提取列。
演示:
$ while read -r _ _ one _ two _; do echo "$one $two"; done < /tmp/file.txt
1657 19.6117
1410 18.8302
3078 18.6695
2434 14.0508
3129 13.5495
解决方案 4:
还有一个更简单的变体 -
$ while read line
do
set $line # assigns words in line to positional parameters
echo "$3 $5"
done < file
解决方案 5:
如果您的文件包含n行,那么您的脚本必须读取该文件n次;因此,如果您将文件的长度加倍,则脚本的工作量就会增加四倍——并且几乎所有工作都被丢弃,因为您要做的就是按顺序循环遍历各行。
相反,循环遍历文件行的最佳方式是使用循环while
,并使用条件命令作为read
内置命令:
while IFS= read -r line ; do
# $line is a single line of the file, as a single string
: ... commands that use $line ...
done < input_file.txt
在您的情况下,由于您想将行拆分为一个数组,并且read
内置函数实际上对填充数组变量有特殊的支持,这正是您想要的,因此您可以这样写:
while read -r -a line ; do
echo ""${line[1]}" "${line[3]}"" >> out.txt
done < /path/of/my/text
或者更好的是:
while read -r -a line ; do
echo "${line[1]} ${line[3]}"
done < /path/of/my/text > out.txt
但是,对于您正在做的事情,您只需使用该cut
实用程序即可:
cut -d' ' -f2,4 < /path/of/my/text > out.txt
(或者awk
,正如 Tom van der Woerdt 所建议的,或者perl
,甚至sed
)。
解决方案 6:
如果您使用结构化数据,这还有额外的好处,即不调用额外的 shell 进程来运行tr
和/cut
或某些操作。...
(当然,您需要使用条件和合理的替代方案来防止错误输入。)
...
while read line ;
do
lineCols=( $line ) ;
echo "${lineCols[0]}"
echo "${lineCols[1]}"
done < $myFQFileToRead ;
...
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD