我在一个文件中有一堆不同设备的数据它是这样设置的:
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
将常量复制到保持空间,然后删除该行。
对于所有其他行,将常量附加到当前行并使用替换重新排列格式。