我有多个排序的 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 space
sed 的功能将数据值从一行保存到下一行。
{
我们使用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