我想将两个字符串合并为一行并|
作为分隔符。我们可以使用 进行合并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(/ \| /,"|")}