默认分隔符

默认分隔符

我想将两个字符串合并为一行并|作为分隔符。我们可以使用 进行合并awk '{$1,$2,$3$4$5}',还有其他方法可以使用|作为分隔符来合并字符串吗?

输入:

XXXXXXXX 0 Xxyxhsag | yuiji

输出:

XXXXXXXX 0 Xxyxhsag|yuiji

答案1

假设您的数据包含由 分隔的字段|,并且分隔|字符两侧可能包含空格。那么您将使用的输入字段分隔符awk是表达式,即匹配字符和任何侧翼空格的*[|] *表达式。|

使用单个字符|作为输出字段分隔符并强制awk重新创建输出记录(通过设置其中一个字段)将解决您的问题,至少以您在问题中提出的方式解决。

awk -F ' *[|] *' -v OFS='|' '{ $1=$1 }; 1' file

或者,等价地,

awk -F ' *[|] *' -v OFS='|' '{ $1=$1; print }' file

测试这个:

$ cat file
XXXXXXXX 0 Xxyxhsag | yuiji
$ awk -F ' *[|] *' -v OFS='|' '{ $1=$1 }; 1' file
XXXXXXXX 0 Xxyxhsag|yuiji

sed您还可以使用类似表达式的替换:

$ sed 's/ *| */|/g' file
XXXXXXXX 0 Xxyxhsag|yuiji

这一切都假设我们可以将数据视为文本或“简单”CSV 数据,在引用的字段中不嵌入分隔符、换行符或引号。

答案2

给定输入数据,

XXXXXXXX 0 Xxyxhsag | one
XXXXXXXX 0 Xxyxhsag     |     two
XXXXXXXX 0 Xxyxhsag|third

默认分隔符

使用默认awk分隔符(一个或多个连续空格或制表符),

awk '{print $1,$2,$3$4$5}' v
XXXXXXXX 0 Xxyxhsag|one
XXXXXXXX 0 Xxyxhsag|two
XXXXXXXX 0 Xxyxhsag|third

注意第三个字段的变化

awk '{printf "3th:[%s]\n",$3}' v
3th:[Xxyxhsag]
3th:[Xxyxhsag]
3th:[Xxyxhsag|third]

如果您的实际情况总是有 5 个字段,这可能是一个解决方案。

管道 (|) 分隔符

您可以将其用作|分隔符,但这会在字段中保留空间

awk -F\| '{printf "%s|%s\n", $1, $2}' v
XXXXXXXX 0 Xxyxhsag | one
XXXXXXXX 0 Xxyxhsag     |     two
XXXXXXXX 0 Xxyxhsag|third

如果我将输出分隔符更改为,这可能会更明确!

awk -F\| '{printf "%s!%s\n", $1, $2}' v
XXXXXXXX 0 Xxyxhsag ! one
XXXXXXXX 0 Xxyxhsag     !     two
XXXXXXXX 0 Xxyxhsag!third

现在,您没有太多增益,因为您必须从 中删除尾随空格$1并从 中删除前导空格$2

答案3

awk可以尝试:

awk -F'|' -v OFS='|' '{sub(/ \| /,"|")} 1' file
XXXXXXXX 0 Xxyxhsag|yuiji
  • 我们设置 FS 和 OFS (相同的值|:)
  • 只有这样我们才能得到这样的结果:
awk -F'|' -v OFS='|' '1' file
XXXXXXXX 0 Xxyxhsag | yuiji
  • |所以我们删除using左右的空格sub()
{sub(/ \| /,"|")}

相关内容