我正在尝试将此输入从file.txt转换为
file.txt
a,b;c^d"e} f;g,h!;i8j-
到这个输出中
a,b,c,d,e,f,g,h,i,j
带awk目前为止我做得最好的是awk '$1=$1' FS="[!;^}8-]" OFS="," file.txt1.如何避免将"解释为特殊字符?"不起作用1.避免输出中出现重复的,,,并删除最后一个,
awk '$1=$1' FS="[!;^}8-]" OFS="," file.txt
"
,,
,
31moq8wy1#
我将按照以下方式利用GNU AWK完成此任务,让file.txt内容
AWK
那么
awk 'BEGIN{FPAT="[a-z]";OFS=","}{$1=$1;print}' file.txt
给出输出
说明:我使用FPAT通知GNU AWK字段是单个小写ASCII字母,并且输出字段分隔符(OFS)是,,然后对于每一行,我执行$1=$1以触发行重建和print行。
FPAT
OFS
$1=$1
print
pzfprimi2#
如果您只想用逗号替换非字母字符并压缩重复的逗号,那么tr是您的好选择:
tr
tr -sc '[:alpha:]' ','
不过这会留下一个逗号,你可以使用sed来删除/替换它:
sed
tr -sc '[:alpha:]' ',' | sed 's/,$/\n/'
另一种可能性是将每个“项目”拆分为自己的行(使用tr或grep -o),然后使用paste再次合并行:
grep -o
paste
tr -sc '[:alpha:]' '\n' | paste -sd,
avkwfej43#
使用任何POSIX awk并假设您希望任何非字母字符充当字段分隔符:
$ awk -F '[^[:alpha:]]+' -v OFS=',' '{printf "%s", p; $1=$1; p=$0} END{sub(OFS"$","",p); print p}' file a,b,c,d,e,f,g,h,i,j
如果您真的只想使用问题中的特定字符集作为字段分隔符,则只需将[^[:alpha:]]+更改为[!;^}8"-]+
[^[:alpha:]]+
[!;^}8"-]+
093gszye4#
awk中的一个(不是所有awk都有,在gawk,mawk,busybox awk和Macos awk版本20200816中测试成功,在Debian的awk版本20121220(又名original-awk)中测试失败。
$ awk -v RS="^$" '{ # read whole file in gsub(/[^a-z]+/,",") # replace all non lowercase alphabet substrings with a comma sub(/,$/,"") # remove trailing comma }1' file # output
输出:
chhkpiq45#
ed是否可用/可接受。script.ed
ed
script.ed
%s/[^a-z]/ /g %s/[[:blank:]]\{1,\}/,/g g/./;j\ s/,$// ,p Q
现在快跑
ed -s file.txt < script.ed
drkbr07n6#
KISS:
$ grep -o '[a-z]' file | paste -sd ',' - a,b,c,d,e,f,g,h,i,j
应该适用于大多数GNU/Linux,甚至busybox和freeBSD(-是强制性的)
GNU/Linux
busybox
freeBSD
-
sgtfey8w7#
使用gnu-sed将a-z以外的1个或多个字符替换为逗号,然后删除所有前导和尾随逗号
gnu-sed
sed -Ez 's/[^a-z]+/,/g; s/^,+|,+$//' file
产出
fhity93d8#
echo "${input_data}" |
mawk 'NF-=_==$NF' FS='[^[:alpha:]]*' OFS=, RS=
如果有可能出现前缘分离,请使用以下代码:一个一个三个一个一个一个一个一个四个一个一个一个一个一个五个一个
nawk
[[:alpha:]]
reparse <[[:alpha:]]+> cclenter : in = | . .. |, out = |ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz ªµºÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ|
即使locale设置为LANG="en_US.UTF-8",nawk对[[:alpha:]]的想法既不是ASCII,也不是完整的Unicode-与ISO-8859-...等传统8位语言环境类似,但不必完全相同
LANG="en_US.UTF-8"
ASCII
Unicode
ISO-8859-...
hof1towb9#
如果您对Perl解决方案没问题,这里有一行代码;
perl -ne '$_ =~ s/[^[:alnum:]]//g; print join(",", split//, $_)'
其输出:
a,b,c,d,ef,g,h,i,8,j
简单地说,您是在用空字符替换非字母数字字符。
9条答案
按热度按时间31moq8wy1#
我将按照以下方式利用GNU
AWK
完成此任务,让file.txt
内容那么
给出输出
说明:我使用
FPAT
通知GNUAWK
字段是单个小写ASCII字母,并且输出字段分隔符(OFS
)是,
,然后对于每一行,我执行$1=$1
以触发行重建和print
行。pzfprimi2#
如果您只想用逗号替换非字母字符并压缩重复的逗号,那么
tr
是您的好选择:不过这会留下一个逗号,你可以使用
sed
来删除/替换它:另一种可能性是将每个“项目”拆分为自己的行(使用
tr
或grep -o
),然后使用paste
再次合并行:avkwfej43#
使用任何POSIX awk并假设您希望任何非字母字符充当字段分隔符:
如果您真的只想使用问题中的特定字符集作为字段分隔符,则只需将
[^[:alpha:]]+
更改为[!;^}8"-]+
093gszye4#
awk中的一个(不是所有awk都有,在gawk,mawk,busybox awk和Macos awk版本20200816中测试成功,在Debian的awk版本20121220(又名original-awk)中测试失败。
输出:
chhkpiq45#
ed
是否可用/可接受。script.ed
现在快跑
drkbr07n6#
KISS:
应该适用于大多数
GNU/Linux
,甚至busybox
和freeBSD
(-
是强制性的)sgtfey8w7#
使用
gnu-sed
将a-z以外的1个或多个字符替换为逗号,然后删除所有前导和尾随逗号产出
fhity93d8#
如果有可能出现前缘分离,请使用以下代码:
一个一个三个一个一个一个一个一个四个一个一个一个一个一个五个一个
nawk
对它所认为的[[:alpha:]]
有一个非传统的定义:即使locale设置为
LANG="en_US.UTF-8"
,nawk
对[[:alpha:]]
的想法既不是ASCII
,也不是完整的Unicode
-与
ISO-8859-...
等传统8位语言环境类似,但不必完全相同hof1towb9#
如果您对Perl解决方案没问题,这里有一行代码;
其输出:
简单地说,您是在用空字符替换非字母数字字符。