看过很多帖子都提出类似的问题。无法让它发挥作用。
输入看起来像:
<field one with spaces>|<field two with spaces>
尝试用awk解析。
从优秀的帖子中尝试了很多变体:
FS = "^[\x00- ]*|[\x00- ]*[|][\x00- ]*|[\x00- ]*$";
FS = "^[\x00- ]*|[\x00- ]*\|[\x00- ]*|[\x00- ]*$";
FS = "^[\x00- ]*|[\x00- ]*\\|[\x00- ]*|[\x00- ]*$";
仍无法使管道分隔符正常工作。
使用CentOS。
任何帮助?
答案 0 :(得分:15)
echo "field one has spaces | field two has spaces" \
| awk '
BEGIN {
FS="|"
}
{
print $2
print $1
# or what ever you want
}'
#output
field two has spaces
field one has spaces
您也可以将其缩小为
awk -F'|' {
print $2
print $1
}'
修改强>
此外,并非所有awks都可以为FS
值采用多字符正则表达式。
<强> EDIT2 强>
不知怎的,我最初错过了这个,但是我发现你试图在\x00
字符的前后字符中包含|
。我认为你的意思是\x00
== null
char?我不认为你能够awk
解析嵌入了空字符的文件。您可以像
tr '\x00' ' ' < file.txt > spacesForNulls.txt
或者用
完全删除它们tr -d '\x00' < file.txt > deletedNulls.txt
并消除你的正则表达式的那部分。但如上所述,某些awk
不支持FS
值的正则表达式。 并且,我没有非常使用tr
技巧,您可能会发现它需要null
字符的略有不同的表示法,具体取决于您的tr
版本。
我希望这会有所帮助。