如何用awk删除文件的一部分

时间:2009-06-28 14:38:14

标签: shell text scripting awk

我正在编写一个shell脚本,在某些时候必须获取一个文件,在其中搜索特定的单词并删除该单词后面的整个文本(包括单词本身) - awk是正确的工具我想,但我对它的编程知之甚少。

有人可以帮助我吗?

6 个答案:

答案 0 :(得分:8)

我认为'awk'是这项工作的一个工具,不过我认为'sed'对于这项特殊操作来说更简单。规范有点模糊。简单的版本是:

  • 找到包含给定单词的第一行。
  • 删除该行以及所有后续行。

为此,我使用'sed':

sed '/word/,$d' file

更复杂的版本是:

  • 找到包含给定单词的第一行。
  • 从单词开始删除该行上的文字。
  • 删除所有后续文字行。

我可能仍然使用'sed':

sed -n '1,/word/{s/word.*//;p}' file

这颠倒了逻辑。默认情况下它不会打印任何内容,但是对于第1行,直到第一行包含单词,它会替换(在包含单词的行之前没有任何作用),然后打印。

可以用'awk'完成吗?并非完全无足轻重,因为'awk'自动将输入行输入到单词中,并且因为你必须使用函数来进行替换。

awk '/word/ { if (found == 0) {
                # First line with word
                sub("word.*", "")
                print $0;
                found = 1
              }
            }
            { if (found == 0) print $0; }' file

已编辑:将'删除'更改为'找到',因为'删除'是'awk'中的保留字。)

在所有这些示例中,输入文件的截断版本将写入标准输出。要在原位修改文件,您需要使用Perl或Python或类似语言,或者将输出捕获到临时文件中,一旦命令完成,您将复制原始文件。 (如果您尝试'脚本文件',则处理空文件。)

可以将各种早期退出优化应用于sed和awk脚本,例如:

sed '/word/q' file

并且,如果您假设使用awk或sed的GNU版本,则可以使用各种非标准扩展来帮助对文件进行原位修改。

答案 1 :(得分:1)

我假设您的输入是这样的:

  

Lorem ipsum dolor sit amet,
  consectetur adipiscing velit。
  Nullam neque sapien,molestie vel congue non,
  feugiat quis tellus。 Ut quis
  nulla mi。 Maecenas一个ligula。

并且您希望输出在单词'vel'处被截断,如下所示:

  

Lorem ipsum dolor sit amet,
  consectetur adipiscing velit。
  Nullam neque sapien,molestie

在这种情况下,您的awk脚本将是:

cat lorem.txt | awk ' 
  /\<vel\>/ 
  {
     print substr($0, 0, match($0, /\<vel\>/) - 1); 
     exit; 
  } 

  { print }
'

您想要切断的单词需要替换脚本中单词vel的两个实例。

您也可以安全地将整个脚本放在一行上。

答案 2 :(得分:1)

awk '/word/{exit}1' file

答案 3 :(得分:0)

我不确定如何使用awk,但你可以使用sed:

sed -i~ -e 's/the-word-to-find.*$//' the-file

这将删除包含the-word-to-find的每一行的the-word-to-find到行尾的所有内容。如果要在第一次出现the-word-to-find时删除文件的其余部分,则可以执行以下操作:

sed -i~ -e 's/\(the-word-to-find\).*$/\1/;/the-word-to-find/,$d'

答案 4 :(得分:0)

这个awk单行应该可以解决问题:     {sub(/ word。* /,“”);打印} 对于每一行,如果该行包含以word开头的模式(以空格开头)并转到该行的末尾 - 将该模式替换为空字符串 - 则打印更新的行。

[想想问题可以读取任何一种方式(该行的全文或文件中的整个文本)。如果想跳过文件的其余部分,可以:{skip = gsub(/ word。* /,“”);打印; if(skip)exit}]

答案 5 :(得分:0)

使用sed删除部分行,例如:

$ echo '12345 John Smith / red black or blue it is a test' | sed -e 's/\/.*//'

$ 12345 John Smith