Bash 文本匹配和编写

Bash 文本匹配和编写

我有多个排序的 txt 文件。它们有我需要在一个输出文件中收集的特定数据。

例如:

1.txt

     Colour:    Red

     Hight:     10

2.txt

     Colour:    Blue

     Hight:     12

如何使用 bash 命令(例如 sed/grep)来搜索特定单词并忽略某些字符以获取数据,并将它们放入一个输出文件中。

例如:

输出.txt

     Colour    Hight

      Red        10

      Blue       12

感谢您帮助 Anees

答案1

假设每个文件总是有 2 个字段并且总是以相同的顺序,这是使用 sed 执行此操作的一种方法:

#!/bin/sh

printf '%s\t%s\n' Colour Hight

sed '

    / *Colour: */ {
        s///
        h
        n
    }

    / *Hight: */ {
        s///
        G
        s/\n/\t/g
    }

' "$@"

这个答案使用hold spacesed 的功能将数据值从一行保存到下一行。

{我们使用and进行语句分组}。该组中的所有命令仅适用于已寻址的行,在本例中为模式/ *Colour */和选择的行/ *Hight */

*Colour *在“颜色”和“高度”行上,我们首先删除与 匹配(或*Higth *)的文本s///

在“颜色”行上,我们将h剩余的文本保存在hold space,然后跳到下一行输入而不打印 ( n)。

在 Hight 行上,我们将G保留空间的内容获取/附加到模式空间,并通过换行符 '\n' 连接起来sed。然后我们用制表符替换\t该换行符并sed打印输出。

这个答案应该适用于所有版本的sed,无论是在 Linux、FreeBSD 还是 OS X 上。

答案2

您可以像这样放置输出文件的标头
echo 'Colour Hight' > out.txt
,然后对于每个文件,您可以执行以下操作:
awk '{printf $2" ";next;}' 1.txt >> out.txt
或者对于所有 txt 文件,您可以执行以下操作:
ls *.txt | xargs awk '{printf $2" ";if (++onr%2 == 0) print "";next;}' >> out.txt

相关内容