unix awk命令:如果行不是以字符开头,则删除行前的新行

8e2ybdfx  于 2022-12-23  发布在  Unix
关注(0)|答案(8)|浏览(233)

尝试使用awk命令实现此规则:如果行不是以"O"开头|"或" A| "或" S| "我想删除前一行上的新行
我在输入中有这个文件(input.txt)

O|field1|field2
O|field1|
field2
A|field1|
field2
S|field1|
field2
O|field1|field2
O|field1|field2
O|field1|
field2
A|field1|
field2
S|field1|
field2
O|field1|field2

我想要这个输出

O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2

执行此代码
第一个月
它回来了

O|field1|field2O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2O|field1|field2O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2

有人能帮帮我吗?

uqcuzwp8

uqcuzwp81#

使用您显示的示例,请尝试以下awk代码。

awk '
BEGIN{FS=OFS="|"}
!/\|/ {
  print val,$0
  val=""
  next
}
$0~/\|$/ && NF==3{
  val=$0
  next
}
1
' Input_file
lndjwyie

lndjwyie2#

这个awk应该适合您:

awk -F'|' 'NF==3 && $3 == "" {p = $0; next}
      {print (NF == 1 ? p $1 : $0); p = ""}' file

O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
voj3qocg

voj3qocg3#

与测试字段值相比,测试记录布局的类似操作可能更适合您:

$ awk -v RS='([^|]*[|]){2}[^|]*\n' '{$0=RT; gsub(/\n/,""); print}' file
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2

上面的代码使用GNU awk for multi-char RS来定义一个记录,它是由| s分隔的3个字段,并以换行符结尾,然后在打印之前删除每个记录中的任何换行符。

l3zydbqr

l3zydbqr4#

您似乎只有缺少最后一个字段的问题。
如果|是字段分隔符,则可以检查第三个字段是否不为空并打印整行。
如果字段1不是AOS,则打印上一行和当前行

awk -F'|' '{
  if($1 !~ /^[AOS]$/) { print p $0; next }
  if ($3!="") print $0
  p = $0
}' file

产出

O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
oprakyz7

oprakyz75#

{m,g,n}awk NF=NF RS= OFS=\| FS='[|]\n'
{  g,n}awk NF=NF RS= OFS=\| FS='\\|\n' 
{m    }awk NF=NF RS= OFS=\| FS='\|\n'
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
myzjeezk

myzjeezk6#

另一种解决方案

awk -v RS="" '{gsub("\\|\n","|")}1' file

O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2

将文件视为一个长流,并删除管道符后的换行符。

wkftcu5l

wkftcu5l7#

使用GNU sed

sed -rz 's/\|\n([^OAS])/\|\1/g' input.txt
tgabmvqs

tgabmvqs8#

不如这样:

awk '/^[OAS]\|/ {if (l){print l}l=$0;next} {l=l $0} END {print l}' inputFile

变量l表示我们正在构建的生产线。
如果输入以特殊字符开头,则打印l(如果它不为空)。否则,开始构建行。END在处理完所有行后运行,以打印出l的最新版本。

相关问题