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

如何在awk中手动设置记录分隔符?,awk,Awk,我有一个文件如下- vipin kumar ........................ kumar ......bangalore something something ....... ; vipin kumar ........................ kumar ......bangalore something something .......(testing ) ; vipin kumar ......................... kumar

我有一个文件如下-

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

我试过下面的命令-

awk '{ORS=(NR%2==0?RS:FS)}1' file.txt
但它没有给出正确的输出,因为

NR%2或NR%3将不起作用,因为我不确定我将获得多少行

然后我试着将RS设置为;下面使用

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

awk'{for(i=1;i我得到了答案,但可能还有其他方法

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 ;
awk'{for(i=1;i@VIPIN KUMAR:Try:

awk '/^vipin kumar/ && Q{print Q;Q=$0;next} {Q=Q?Q FS $0:$0} END{print Q}' Input_file
编辑:根据OP的要求,以下内容也会有所帮助

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

$ 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 ;
输出

$ 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 ;

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

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

…但我真的很喜欢。

如何通过下面的测试用例-(行开头的不同名称)arun kumar………kumar………班加罗尔某物……;varun kumar………班加罗尔某物……(测试);vipin kumar…………kumar…………班加罗尔某物;@VIPINKUMAR:哪个测试用例?请告诉我。编辑:根据您显示的输入文件代码,如果您有任何其他要求,那么您必须告诉我们您需要什么样的通用模式或通过什么样的模式获取数据?@VIPINKUMAR:请编辑您的帖子并尝试将这个新场景定位到代码标记中,因为没有代码标记我无法理解它。同意您的评论-唯一常见的事情是:当它找到时,应该完成这行“;”正如所建议的-问题已用条件更新。不幸的是,它将同时删除
end@AkshayHegde我明白了。更改了。
^1
现在看起来很好。这是我在过去一个小时里一直在尝试的东西。谢谢!嗨,Akshay,我遇到了一个类似的问题,但无法理解您的解决方案,请您解释一下您的命令在做什么?@Vicky如果line/record/row包含分号
,则将输出行分隔符(
ORS
)设置为默认行分隔符(
RS
),即
\n
否则将
ORS
设置为字段分隔符
FS
,即单个空格,上述语法等于
awk'{if($0~/;/){ORS=RS}else{ORS=FS};打印$0}'文件
其中,
$0
是当前记录/行/行