将文件中第二行的第二个字段附加到第一行

将文件中第二行的第二个字段附加到第一行

如何将以下文件(示例中)生成为示例中所述的文件,

状态行中的每个最后一个单词(示例中)应添加到前一行的最后一行

示例中

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

使用ex,POSIX 指定的可编写脚本的文件编辑器:

printf '%s\n' 'g/state/s/^ *state *//|-j' x | ex file.txt

s命令是标准替换。意思-j是“在上一行 ( -) 上,执行连接命令 ( j)”,该命令以空格分隔连接下一行。

实际上,因为join 命令忽略要连接的行上的前导空格,并且因为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 是HDFSdo
l=$0;next将行存储在 var l(elle, line) 中移动到下一行。
$1=="state"{ … }对于字段 1 为statedo 的行...打印存储在 var (elle) 和字段 2
{print(l,$2)}中的行。避免打印 的过时(旧)值。l
{l=""}l

相关内容