我正在处理一些包含字段分隔符的文本,这些字符分隔符是“||||”:
substring1||||substring2
子字符串也可能包含空格。我想根据分隔符“||||”拆分这些字符串,但我找不到合适的方法来做到这一点。 我尝试了以下命令:
echo "substring1||||substring2" | awk '{split($0,a,"||||"); a[2],a[1]}'
实际上,如果我只有一个“|”那个命令有效作为分隔符。但我的问题是我有多个管道角色。
我也试过
a=($(echo "substring1||||substring2" | sed -e "s/||||/\n/g"))
如果子字符串不包含空格,它可以正常工作。但由于子字符串可能包含空格,因此它们也会在空格中分割,这是不可取的。
有什么想法吗?
答案 0 :(得分:9)
使用正则表达式作为输入字段分隔符,如:
awk -F'[|]{4}' '{ printf "Field 1 -> %s\nField 2 -> %s\n", $1, $2 }' infile
假设infile
包含内容:
sub string 1||||sub string2
它产生:
Field 1 -> sub string 1
Field 2 -> sub string2
编辑:对于不接受awk
语法的旧{n}
版本,请使用-F'[|][|][|][|]'
或-F'[|]+'
,例如:
awk -c -F'[|]+' '{ printf "Field 1 -> %s\nField2 -> %s\n", $1, $2 }' infile
还要添加--re-interval
,感谢 blue 的评论:
awk -c --re-interval -F'[|]{4}' '{ printf "Field 1 -> %s\nField2 -> %s\n", $1, $2 }' infile
答案 1 :(得分:3)
使用GNU awk
,您可以使用FPAT
来描述字段的内容,而不是描述字段分隔符的内容:
$ echo "substring1||||substring2" | awk '{print $1,$2}' FPAT='[^|]+' OFS='\n'
substring1
substring2
答案 2 :(得分:2)
split
中awk
使用的模式实际上是正则表达式,因此||||
实际上可能是4个交替运算符而不是4个字面竖线(我不确定,因为在某些情况下,|
可以是文字垂直条。
要匹配竖线,请使用\|
或[|]
。所以对于你想要的,你可以做到这一点
awk '{ split($0, a, /\|+/); print a[2],a[1]}' file
注意我使用/.../
(正则表达式常量)来包含模式而不是引号(动态正则表达式)。关于gawk manual的差异的一些细节。
如果你想将第1列写入一个文件,将第2列写入另一个文件,你可以在awk
中完成所有操作(我正在使用Birei的方式,因为它更简洁)。
awk -F'[|]+' '{c1 = c1 $1 "\n"; c2 = c2 $2 "\n"} END {printf c1 >"file1"; printf c2 >"file2"}' input_file
这会将第1列条目附加到c1
,由换行符第2列分隔为c2
。然后在处理输入文件后将两者打印为单独的文件。
注意:
awk
中进行连接。printf
没有附加换行符,因为我们在c1
和c2
末尾已经有了一个额外的换行符。printf
及其参数之外的所有水平间距都是可选的。旁注:-F
的值实际上是动态正则表达式,因此'[|]+'
的等效值为'\\|+'
。
答案 3 :(得分:-3)
尝试使用sed和tr ...看看它是否有帮助!!
<强> INPUT.TXT 强>
sub string 1||||sub string 2
or
substring1||||substring2
<强>代码强>
sed 's/||*/%~%/g' Input.txt| tr "%~%" '\n' | sed '/^$/d'
注意强>
使用任何类似“%〜%”的表达式....任何表达式(我已经使用过)都不会出现在文本文件中...并使用sed和tr替换它...