拆分包含pipe道字符的string

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

substring1||||substring2 

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

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

实际上,如果我只有一个“|” 作为分隔符。 但我的问题是,我有不止一个pipe道字符。

我也试过了

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

它工作正常,如果子string不包含空格。 但是由于子string可能包含空格,所以它们也在空格上分开,这是不希望的。

任何想法?

使用正则表达式作为输入字段分隔符,如:

 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 

编辑 :对于不接受{n}语法的旧版awk版本,使用-F'[|][|][|][|]'-F'[|]+'

 awk -c -F'[|]+' '{ printf "Field 1 -> %s\nField2 -> %s\n", $1, $2 }' infile 

还要加上--re-interval ,感谢蓝色的评论:

 awk -c --re-interval -F'[|]{4}' '{ printf "Field 1 -> %s\nField2 -> %s\n", $1, $2 }' infile 

GNU awk你可以描述一个字段使用FPAT而不是描述字段分隔符是什么:

 $ echo "substring1

|substring2" | awk '{print $1,$2}' FPAT='[^|]+' OFS='\n' substring1 substring2

awk使用的模式实际上是正则表达式,所以

| 实际上可能是4个替代操作符而不是4个文字竖线(我不确定,因为在某些情况下, |可以是一个文字竖线。

要匹配竖线,请使用\|[|] 。 所以为了你想要的,你可以这样做

 awk '{ split($0, a, /\|+/); print a[2],a[1]}' file 

注意我用/.../ (正则表达式常量)来封闭模式而不是引号(动态正则表达式)。 关于gawk手册的一些细节。


如果你想写第一列到一个文件,第二列写到另一个文件,你可以在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. 除了printf和它的参数之外,awk脚本中的所有水平间距都是可选的。

旁注: -F的值实际上是一个动态正则表达式,因此相当于'[|]+''\\|+'

尝试使用sed和tr …看看是否有帮助!

INPUT.TXT

 sub string 1

|sub string 2 or substring1

|substring2

  sed 's/||*/%~%/g' Input.txt| tr "%~%" '\n' | sed '/^$/d' 

注意

使用任何表达式,如“%〜%”….任何表达式(如我已经使用),它不会出现在您的文本文件…并用sed和tr替换…