【问题标题】:Pattern match in a column in bashbash中列中的模式匹配
【发布时间】:2020-04-02 06:00:42
【问题描述】:

我想在文本文件中抓取包含Subject01Subject02、...Subject50 的行,并在每个文件中将它们分开。下面是我做的代码,输出文件的结果是空的。谁能告诉我我做错了什么?

Subject01/path/here    4
Subject01/path/here    1
Subject02/path/here    3
Subject03/path/here    5
Subject03/path/here    6
...

所以其中一个输出可以是以下格式:

Subject03/path/here    5
Subject03/path/here    6

这是我尝试过的代码,但失败了。

#!/bin/sh
subject=Subject
for i in {01..50}
do
        awk '{ if ($1 == "${subject}${i}") { print } }' output-0 > output-0-sub-$i
done

【问题讨论】:

  • 我不明白您是想简单地 grep 行,还是将实际文件 (Subject03/path/here) 的内容保存在 output-0-sub-$i 中。它可能是第二个,因为如果不是你可以简单地for f in {01..10}; do grep "Subject$f" Input_file >> output-0-sub-$f ;done
  • for f in {01..10}; do grep "Subject$f" Input_file >> output-0-sub-$f ;done 工作!但我怎样才能防止生成空文件?与此命令一样,已生成一些输出文件,例如如果Subject04 不在第一列中,则其输出将为空。这可以在脚本中实现还是我必须找到其他方式
  • 查看答案
  • @user8034918 grep 如果没有选择行,则返回退出代码 1。您可以测试退出代码,或者测试生成的文件是否为空,如果确实为空,则将其删除。

标签: bash awk text-processing


【解决方案1】:

您可以简单地使用 grep

for f in {01..10}; do
   grep "Subject$f" inputFile.txt >> output-0-sub-$f 
   if [[ ! -s output-0-sub-${f} ]] ; then 
      rm output-0-sub-$f 
   fi
done

if 条件是检查文件是否为空,如果是,则将其删除。 您也可以添加 -f 标志来检查文件是否存在,但这取决于您的脚本的工作方式。

【讨论】:

    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2020-07-05
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多