如何删除行&;在unix中基于particluar字段填充

如何删除行&;在unix中基于particluar字段填充,unix,gawk,nawk,awk,Unix,Gawk,Nawk,Awk,我想根据“客户总数”和后续单位行删除行,直到下一个名称。 “客户总计”行之后的单位行数(即30.0和15.0行)可能会有所不同,直到下一个名称。 最重要的是,文件没有分隔。 下面是我的输入文件。 输入: 32629 DT MBSA的相对性/O 15.05850厅 30.0 21650厅 34145 DT MBSA的相对性/O 30.0 10850厅 *客户完全相对论/O F 38350 30.0 32,500 15.0 5,850 辉瑞96607 D

我想根据“客户总数”和后续单位行删除行,直到下一个名称。
“客户总计”行之后的单位行数(即30.0和15.0行)可能会有所不同,直到下一个名称。 最重要的是,文件没有分隔。 下面是我的输入文件。 输入:

32629 DT MBSA的相对性/O
15.05850厅 30.0 21650厅 34145 DT MBSA的相对性/O
30.0 10850厅 *客户完全相对论/O F 38350 30.0 32,500 15.0 5,850 辉瑞96607 DT MBSA
15.032700厅 30.021300厅 辉瑞96609 DT MBSA
60.0 30200厅 75.0182100厅 90.067700厅 *客户总数:辉瑞334000 90.0 67,700 30.0 21,300 15.032700

我希望我的输出如下。
输出:

32629 DT MBSA的相对性/O
15.05850厅 30.0 21650厅 34145 DT MBSA的相对性/O
30.0 10850厅 辉瑞96607 DT MBSA
15.032700厅 30.021300厅 辉瑞96609 DT MBSA
60.0 30200厅 75.0182100厅 通过awk的大厅90.0 67700

$ awk '$1=="-----"{x=0} NF==1{x=1}x' file
34567
20.0    5,678
20.0    5,678
20.0    5,678
20.0    5,678
20.0    5,678
78545
20.0    41,424
20.0    41,424
30.0    41,424
它跳过第1列中包含
----
的行,直到整行
$0
相当于第1列
$1
的行

更新:

$ awk 'NF==1{print; var=$1}NF==2{print var"   "$2}' file
34567
34567   5,678
34567   5,678
34567   5,678
34567   5,678
34567   5,678
78545
78545   41,424
78545   41,424
78545   41,424


$0==$1
是一种奇怪的方法来测试是否只有一个字段
NF==1
会更自然。如果
$1
包含
3
$2
包含
0
,该怎么办?Awk可能会进行数字比较,然后,
$0==$1
将为真,尽管有2个字段。Hi-Ed和Avinash…。如果字段2中有空值,则上述代码不起作用,它将在字段1中填充错误的id。。。因此,如果您能更正上述代码,我将不胜感激。…@Avinash Raj和@Ed Morton“字段2中的空值”是什么意思?您的“文件”选项卡是分隔的还是固定宽度的字段或其他内容?更新您的问题以澄清并更新示例输入/预期输出以显示该情况。我的文件以制表符分隔,假设我的字段2没有任何值,根据上述代码,它将填充错误的id,如字段1中的20.0或30.0。。。但我希望我的id(五位数)在字段1中显示,即使字段2为空…@EdMorton@Praveenkumar-说真的,更新你的问题!在不同位置的评论中分发这些信息片段,并且让您发布的问题不包含最新信息,并且有一个不包含您实际拥有和关心的测试用例的示例,这让我们这些试图帮助您的人感到沮丧,特别是当你一直忽略更新问题的请求时。你真的想要中间的输出/输入文件,还是只想将上面的第一个输入文件转换为最后一个输出文件?我想要最后一个输出作为我的第一个输入。那么为什么不清理你的问题以表明这一点,这样阅读它的人就不会浪费时间呢时间?
$
是一个提示
tst.awk
是一个包含awk脚本的文件,该脚本以
BEGIN
开头,以
$2}
结尾
cat tst.awk
是您执行以查看文件内容的命令
tst.awk
。请获取Chris Johnson的《Shell脚本编写方法》一书,学习Shell编程的基础知识。很好,Ed…感谢您推荐这本书,因为我是unix新手…而且代码返回了错误的输出,我没有得到上面的输出。。。它只返回field1值,field2为空…该脚本不可能打印field1值。要么您的输入文件与您描述的不一样(是否
cat-v
显示了其中的任何控制字符),要么您在复制/粘贴脚本时出错,要么您的awk已损坏(您使用的是什么操作系统,以及
awk--version
输出是什么),要么您错误地调用了它。除此之外,做一件显而易见的事情,开始向脚本添加调试print语句,以找出问题所在。如果您的输入文件的格式与您所说的一样,并且您有一个功能性的awk,则脚本将生成所需的输出,如您所见。请完全按照我在上面的回答中所做的操作,并将结果复制/粘贴到您的问题中,以便我们可以看到您正在执行的内容、执行的方式以及您获得的输出。您好,Ed,完成所有类型的调试、文件检查和脚本编写。。。但我的方式没有任何效果…我再次按照上面的方式编辑了输入文件,如果您可以测试上面的文件,并且看起来是否良好,那将是非常棒的…我的awk版本是3.1.5…@Ed Morton
$ cat tst.awk
BEGIN{ FS=OFS="\t" }
/^[[:digit:]]+[[:space:]]*$/ { id = $1; inRec = 1 }
/^-/  { inRec = 0 }
inRec { print id, $2 }
$ awk -f tst.awk file
25333
98275
98275   68,000
98275   149,000
98275   41,000
98275
98275   22,000
98275   162,000
25333
31932
31932   334,000
31932
31932   53,000
31932   47,000