如何在awk中手动设置记录分隔符?

4

我有一个像下面这样的文件 -

vipin kumar ........................ kumar ......bangalore
    something something .......
;
vipin kumar ........................ kumar ......bangalore
    something something .......(testing
)
;
vipin kumar ......................... kumar .....bangalore
something something ;

我希望输出如下所示(文件中的名称和数字可能不同,但唯一共同点是当我们有“;”时行结束)
vipin kumar ........................ kumar ......bangalore   something something .......;
vipin kumar ........................ kumar ......bangalore    something something .......(testing);
vipin kumar ......................... kumar .....bangaloresomething something ;

I want to set the RS to ";" . 

我尝试了以下命令 -
awk '{ORS=(NR%2==0?RS:FS)}1' file.txt

但它没有给出正确的输出,因为NR%2NR%3不起作用,因为我不确定我会得到多少行后会有一个分号;

然后我尝试使用以下代码将RS设置为;

awk '{for(i=1;i<=NF;i++) (ORS=(if($i ~ /;/?RS:FS);break}1' file.txt

但是这条命令没有生效。
4个回答

7

输入

$ cat f
vipin kumar ........................ kumar ......bangalore
    something something .......
;
vipin kumar ........................ kumar ......bangalore
    something something .......(testing
)
;
vipin kumar ......................... kumar .....bangalore
something something ;

输出

$ awk 'ORS=/;/?RS:FS'  f
vipin kumar ........................ kumar ......bangalore     something something ....... ;
vipin kumar ........................ kumar ......bangalore     something something .......(testing ) ;
vipin kumar ......................... kumar .....bangalore something something ;

1
不错..这正是我在过去一小时里一直尝试的东西..谢谢! - VIPIN KUMAR
嗨,Akshay,我遇到了一个类似的问题,但是无法理解你在这里的解决方案,请问你能否解释一下你的命令是做什么的? - Vicky
@Vicky 如果行/记录/行包含分号;,则将输出行分隔符(ORS)设置为默认行分隔符(RS),即\n,否则将ORS设置为字段分隔符FS,即单个空格。上述语法等同于awk '{ if ( $0 ~ /;/) { ORS = RS } else { ORS = FS } ; print $0 }' file,其中$0是当前记录/行/线。 - Akshay Hegde

2

@VIPIN KUMAR: 请尝试:

awk '/^vipin kumar/ && Q{print Q;Q=$0;next} {Q=Q?Q FS $0:$0} END{print Q}' Input_file

编辑: 根据发帖者的要求,以下内容也可能有所帮助。

awk '{printf("%s%s",$0,$0~/\;/?RS:"")}'  Input_file

如何通过以下测试用例 -(不同名称在行开头)阿伦·库马尔........................库马尔......班加罗尔 某些东西...... ; 瓦伦·库马尔........................库马尔......班加罗尔 某些东西.......(测试) ) ; 维平·库马尔........................库马尔......班加罗尔 某些东西; - VIPIN KUMAR
@VIPINKUMAR:是哪个测试用例?您能告诉我吗? 编辑:根据您提供的Input_file代码,如果您有其他要求,请告诉我们需要按哪种模式或共同点获取数据。 - RavinderSingh13
@VIPINKUMAR:请编辑您的帖子,并尝试将此新场景放入代码标签中,因为我无法在没有代码标签的情况下理解它。 - RavinderSingh13
同意您的评论 - 唯一共同点:当找到“;”时,行应该被完成。 - VIPIN KUMAR
根据建议 - 问题已经更新,附带条件。 - VIPIN KUMAR
@VIPINKUMAR:您能否尝试我的编辑答案并告诉我它的效果如何? - RavinderSingh13

1

我得到了答案,但可能还有其他的方法来实现。

awk '{for(i=1;i<=NF;i++) (ORS=($i ~ /;/)?RS:FS)}1' file.txt
vipin kumar ........................ kumar ......bangalore     something something ....... ;
vipin kumar ........................ kumar ......bangalore     something something .......(testing ) ;
vipin kumar ......................... kumar .....bangalore something something ;

1
我的第一意图是使用这个:

My first intention was to use this:

awk '{gsub(/\n/,"",$0); printf "%s;\n", $0}'  ORS='\n' RS=\; a.txt

......但我真的很喜欢Akshay Hegde的回答


不幸的是它将删除末尾的; - Akshay Hegde
1
@AkshayHegde 我明白了。已更改。 - hek2mgl
^1 现在看起来很好。 - Akshay Hegde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接