拆分包含管道符的字符串

时间:2013-06-09 10:07:10

标签: linux bash text sed awk

我正在处理一些包含字段分隔符的文本,这些字符分隔符是“||||”:

substring1||||substring2

子字符串也可能包含空格。我想根据分隔符“||||”拆分这些字符串,但我找不到合适的方法来做到这一点。 我尝试了以下命令:

echo "substring1||||substring2" | awk '{split($0,a,"||||"); a[2],a[1]}'

实际上,如果我只有一个“|”那个命令有效作为分隔符。但我的问题是我有多个管道角色。

我也试过

a=($(echo "substring1||||substring2" | sed -e "s/||||/\n/g")) 

如果子字符串不包含空格,它可以正常工作。但由于子字符串可能包含空格,因此它们也会在空格中分割,这是不可取的。

有什么想法吗?

4 个答案:

答案 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)

splitawk使用的模式实际上是正则表达式,因此||||实际上可能是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。然后在处理输入文件后将两者打印为单独的文件。

注意:

  1. 通过将字符串并排放在awk中进行连接。
  2. 我使用的printf没有附加换行符,因为我们在c1c2末尾已经有了一个额外的换行符。
  3. awk脚本中除printf及其参数之外的所有水平间距都是可选的。

  4. 旁注:-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替换它...