如何使用awk(或sed)将数据集标签放到数据集的每一行?



我在一个文件中有一堆不同设备的数据它是这样设置的:

device: thing1
data1 data2 data3 data4
data1 data2 data3 data4
...
device: thing2
data1 data2 data3 data4
data1 data2 data3 data4
...

我需要像这样格式化它:

thing1 data1 data2 data3 data4
thing1 data1 data2 data3 data4
...
thing2 data1 data2 data3 data4
thing2 data1 data2 data3 data4

我在想awk才是正确的方法。设备标签:"每隔几百行左右出现一次,表示来自其他设备的数据集。我可以匹配它,然后把第二个字段放入一个变量中。问题是,我不确定如何匹配它而不排除所有行与数据。以下是我目前得到的:

-bash-4.2$ awk '/device:/{device=$2; print device, $0;}' data_sets.txt | head -n 10
thing2 device: thing2
thing3 device: thing3
thing6 device: thing6
thing7 device: thing7
another_thing0 device: another_thing0
another_thing1 device: another_thing1
thing2 device: thing2
thing3 device: thing3
thing6 device: thing6
thing7 device: thing7

假设:

  • device:行只包含2个空格分隔的字符串(例如,设备名称不包含空格)
  • 不打印device:
  • 如果有空行,则跳过它们
  • 单个空格的默认输出字段分隔符(OFS)足以产生输出

一个awk想法:

awk '
/^device:/ { device=$2; next }          # make note of our new device name; skip to next line of input
NF > 1     { print device,$0 }          # if line is not blank/empty then print the label and the current line of input
' data_file.txt

由此产生:

thing1 data1 data2 data3 data4
thing1 data1 data2 data3 data4
thing2 data1 data2 data3 data4
thing2 data1 data2 data3 data4
sed -e "s/^(.*)/constant_fieldname 1/" filename

你可以尝试这样做,在每一行的开头添加一些东西

这可能适合您(GNU sed):

sed -E '/^constant_fieldname: S+$/{h;d};G;s/^(.*)nS+: (S+)$/2 1/' file

将常量复制到保持空间,然后删除该行。

对于所有其他行,将常量附加到当前行并使用替换重新排列格式。

相关内容

  • 没有找到相关文章

最新更新