繁体   English   中英

如何将第一行的第一个字段复制到后续行中?

[英]How do I copy the first field of the first line into succeeding lines?

试图使这种表达起作用,有人可以看一下并告诉我距离我有多远吗?

我正在尝试在第1行中获取信息以传播到其他空白行。

Line 1 = "1234, type"
Line 2..99 = ", type"

结果:第1行。= =“ 1234,键入”

这是表达

sed -i -R -n '{(^[^,]{});x;n;^,;s/^.{}/\1/;x;p;x;p}' SedExit.txt > Str.txt

万一您对基于awk的解决方案感兴趣,并假设我在上面的评论中对您的请求的解释是正确的:

awk -F, 'BEGIN { OFS = "," } $1 { last = $1 } !$1 { $1 = last } { print }' SedExit.txt 

编辑 :简要说明-

-F,告诉awk使用逗号作为输入字段分隔符; 它将自动以逗号分隔行,并使各个字段可用为$ 1,$ 2等($ 0是整行)

BEGIN { code }在awk运行开始时大括号内运行一次代码,然后处理任何输入。

OFS = ","将输出字段分隔符设置为逗号,以匹配输入。 这使我们可以直接修改字段,并且仍然获得逗号分隔的输出,而不必在代码中重新构建整行。

其余代码每行输入运行一次:

$1 { last = $1 }第一个$1是要执行下一个代码块所必须满足的条件:如果当前行的该字段为true(非空),则运行该块。 该块将该字段的副本保存在名为“ last”的新变量中。

因此,如果在第一个逗号之前有任何内容,我们会记住它以备后用。

!$1 { $1 = last }这里的条件被否定,因此,仅当第一个字段为空时,此块才运行。 在这种情况下,我们将以其他方式复制,并将第一个字段设置为last的值。 希望我们之前已经看到了与第一个块匹配并将last一个设置为某行的行,否则这没有用。

{ print }这里没有条件,因此代码在每一行上运行,并且只打印出来。 如果适用,输出将包含我们对$ 1的修改。

问题陈述

您希望将第一行的第一个字段复制到每个后续行的第一个字段中,最好使用sed。

将第一个字段存储在变量中,然后在行范围内执行sed表达式。

FIELD1=$(head -n1 /tmp/foo | cut -d, -f1)
sed "2,$ s/^.*,/$FIELD1,/" /tmp/foo

这可能对您有用:

sed '/^,/!{h;b};G;s/\(.*\)\n\([^,]*\).*/\2\1/' file

说明:

  • 如果该行不是以逗号开头,则将该行保存在保留空间(HS)中并中断,即无需进一步处理,而是打印该行。 /^,/!{h;b}
  • 如果该行的确以逗号开头,则将换行符和HS的内容附加到模式空间(PS)。 G
  • 将HS中的第一个字段添加到当前行之前,直到第一个逗号为止,然后删除所有其他余数。 s/\\(.*\\)\\n\\([^,]*\\).*/\\2\\1/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM