在文本文件中取第 n 列

新手上路,请多包涵

我有一个文本文件:

 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

它可以工作,但非常复杂,处理长文本文件需要很长时间。

有没有更简单的方法来做到这一点?

原文由 mnrl 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 522
2 个回答

iirc:

 cat filename.txt | awk '{ print $2 $4 }'

或者,如评论中所述:

 awk '{ print $2 $4 }' filename.txt

原文由 Tom van der Woerdt 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 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 列

cut 作为纯 shell 解决方案对于大文件来说 _要快得多_。如果您的文件由多个空格分隔,您可以先删除它们,例如:

 sed 's/[\t ][\t ]*/ /g' < datafile.txt | cut -d' ' -f3,5

其中(gnu)sed 将用单个 space 替换任何 tabspace 字符。

对于一个变体 - 这里也是一个 perl 解决方案:

 perl -lanE 'say "$F[2] $F[4]"' < datafile.txt

原文由 clt60 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题