我正在处理一些包含“||||”字段分隔符的文本:
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
分隔。 然后在处理输入文件之后打印两个文件以分开文件。
笔记:
awk
通过并排放置串来工作。 printf
,它不会追加换行符,因为我们在c1
和c2
的末尾已经有了一个额外的换行符。 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替换…