如何将以下文件(示例中)生成为示例中所述的文件,
状态行中的每个最后一个单词(示例中)应添加到前一行的最后一行
示例中
HDFS worker01.gtdns.com
state STARTED
HDFS worker02.gtdns.com
state STOP
HDFS worker03.gtdns.com
state STARTED
HDFS worker05.gtdns.com
state STARTED
HDFS worker06.gtdns.com
state STARTED
HDFS worker07.gtdns.com
state STARTED
HDFS worker08.gtdns.com
state STARTED
HDFS worker09.gtdns.com
state STOP
示例(预期结果)
HDFS worker01.gtdns.com STARTED
HDFS worker02.gtdns.com STOP
HDFS worker03.gtdns.com STARTED
HDFS worker05.gtdns.com STARTED
HDFS worker06.gtdns.com STARTED
HDFS worker07.gtdns.com STARTED
HDFS worker08.gtdns.com STARTED
HDFS worker09.gtdns.com STOP
答案1
awk '$1 == "HDFS" { printf( "%s ", $0 ) }; $1=="state" { print $2 }' /path/to/input
该awk
脚本是相当不言自明的:在第一个字段为 的行上HDFS
,在该行附加一个空格并按原样打印它,不带尾随换行符。在第一个字段所在的行上state
,打印第二个字段和(隐含的)尾随换行符。
答案2
短GNUAWK
方法:
awk -v RS='[[:space:]]+state' '{ printf "%s", $0 }' file
-v RS='[[:space:]]+state'
- 将state
带有前导空格的子字符串[[:space:]]+
视为输入记录分隔符RS
输出:
HDFS worker01.gtdns.com STARTED
HDFS worker02.gtdns.com STOP
HDFS worker03.gtdns.com STARTED
HDFS worker05.gtdns.com STARTED
HDFS worker06.gtdns.com STARTED
HDFS worker07.gtdns.com STARTED
HDFS worker08.gtdns.com STARTED
HDFS worker09.gtdns.com STOP
对于“2行”静态格式 - 您也可以尝试以下方法SED
方法:
sed '/^[[:space:]]*HDFS/{ N; s/[[:space:]]*state // }' file
答案3
printf '%s\n' 'g/state/s/^ *state *//|-j' x | ex file.txt
该s
命令是标准替换。意思-j
是“在上一行 ( -
) 上,执行连接命令 ( j
)”,该命令以空格分隔连接下一行。
实际上,因为j
oin 命令忽略要连接的行上的前导空格,并且因为s
如果未提供正则表达式,则重用先前的正则表达式,因此以下命令将正常工作并给出相同的结果:
printf '%s\n' 'g/state/s///|-j' x | ex file.txt
请注意,这会将更改保存到文件中。要查看更改而不保存它们,请改用以下命令:
printf '%s\n' 'g/state/s///|-j' %p | ex file.txt
答案4
假设HDFS之后总是有一种状态,这解决了问题:
awk '$1=="HDFS"{l=$0;next};$1=="state"{print(l,$2);l=""}' file
$1=="HDFS"{ … }
对于行,字段 1 是HDFS
do …
。
l=$0;next
将行存储在 var l
(elle, line) 中移动到下一行。
$1=="state"{ … }
对于字段 1 为state
do 的行...打印存储在 var (elle) 和字段 2
{print(l,$2)}
中的行。避免打印 的过时(旧)值。l
{l=""}
l