我需要您在创建输出时提供支持。输出为
1 ABC STATUS
7 PROHIBITED
8 PROHIBITED
2 CDE STATUS
7 PROHIBITED
8 PROHIBITED
3 FGH STATUS
142 PROHIBITED
2 HIJ STATUS
7 PROHIBITED
我正在努力实现
`1 ABC STATUS 7 PROHIBITED 8 PROHIBITED
2 CDE STATUS 7 PROHIBITED 8 PROHIBITED
3 FGH STATUS 142 PROHIBITED
2 HIJ STATUS 7 PROHIBITED
OR
`1 ABC STATUS
1 ABC 7 PROHIBITED
1 ABC 8 PROHIBITED
2 CDE STATUS
2 CDE 7 PROHIBITED
2 CDE 8 PROHIBITED
3 FGH STATUS
3 FGH 142 PROHIBITED
2 HIJ STATUS
2 HIJ 7 PROHIBITED
2 HIJ 8 PROHIBITED `
到目前为止,我已经尝试用
在一行中实现这一点cat file | paste -sd'tn'
,但没有显示预期的结果。如果有人能给我提供指导,我将不胜感激。
生成第一组输出的awk
想法:
awk '
{ if (NF==3)
printf "%s%s",(NR>1 ? "n" : ""),$0 # if not 1st row of input then prefix the output with "n" (to terminate previous line of output)
else
printf "%s",$0
}
END {print ""} # terminate last line of output
' file
由此产生:
1 ABC STATUS 7 PROHIBITED 8 PROHIBITED
2 CDE STATUS 7 PROHIBITED 8 PROHIBITED
3 FGH STATUS 142 PROHIBITED
2 HIJ STATUS 7 PROHIBITED 8 PROHIBITED
使用任何POSIX awk都可以测试一行是否以空格开头:
$ awk '{printf "%s%s", (/^[[:space:]]/ ? "" : sep), $0; sep=ORS} END{print ""}' file
1 ABC STATUS 7 PROHIBITED 8 PROHIBITED
2 CDE STATUS 7 PROHIBITED 8 PROHIBITED
3 FGH STATUS 142 PROHIBITED
2 HIJ STATUS 7 PROHIBITED
使用您显示的示例和尝试,请尝试遵循GNUawk
代码。
awk -v RS='(^|n)[0-9]+' -v OFS="t" '
RT && FNR>1{
gsub(/n/,"")
$1=$1
print
}
END{
if($0){
gsub(/^ +|n/,"")
$1=$1
print
}
}
' Input_file
这可能适合您(GNU sed):
sed '/^S/{:a;x;s/n//gp;d};H;$!d;ba' file
将记录存储在保持空间中,在新记录的开头或文件的末尾,交换回保持空间,删除所有换行符并打印。
注意:新记录由行首的非空白字符指定。
如果要连接的行总是以空格开头,就像在示例输入中一样,那么sed
解决方案可以是
sed -e :a -e '$!N;s/n([[:blank:]])/1/;ta' -e 'P;D' file