我有一个记录如下的文件
FIRST 1: SECOND 2: THREE 4: FIVE 255: SIX 255
我想删除空格和之间的值:
FIRST:SECOND:THREE:FIVE:SIX
使用代码
awk -F '[[:space:]]*,:*' '{$1=$1}1' OFS=, file
答案 0 :(得分:1)
您也可以在[[:digit:]]
后面加上星号,并仅在OFS=
之后留一个空格:
$ awk -F '[[:space:]][[:digit:]]*' '{$1=$1}1' OFS= file
FIRST:SECOND:THREE:FIVE:SIX
答案 1 :(得分:1)
在gnu awk上尝试过:
awk -F' [0-9]*(: *|$)' -vOFS=':' '{print $1,$2,$3,$4,$5}' file
尝试使用gnu sed:
sed -E 's/\s+[0-9]+(:|$)\s*/\1/g' file
awk的解释,
正则表达式,一个空格,后跟
[0-9]+
一个或多个数字,然后是文字:
,后跟一个或多个空格:*
,如果所有这些都匹配,则收集所有内容除了这种匹配的模式,即。 FIRST,SECOND等...之所以如此,是因为-F
选项将其确定为字段分隔符(FS),而$ 1,$ 2 ..等始终不是FS。但是输出需要漂亮的外观,即。具有FS,因此它将为:
,并且它将是awk变量定义-vOFS =':'
答案 2 :(得分:0)
要在惯用的 awk 中获得我们想要的输出,我们使输入字段分隔符(带有-F
)包含我们要消除的所有内容(带有:
固定) ),然后将输出字段分隔符(OFS
)替换为我们想要的内容。需要注意的是,这不会消除行尾的空格和数字,为此,我们需要做更多的事情。 GNU awk 的实现将允许我们对输入记录分隔符(RS
使用正则表达式,但是我们可以对POSIX投诉做一个简单的sub()
以及。最后,通过$1=$1
强制重新计算...此模式/语句的副作用是缓冲区将被重新计算,为我们执行FS / RS替换,并且非空白行将采取默认操作-是要打印。
gawk -F '[[:space:]]*[[:digit:]]*:[[:space:]]*' -v OFS=: -v RS='[[:space:]]*[[:digit:]]*\n' '$1=$1' file
或者:
awk -F '[[:space:]]*[[:digit:]]*:[[:space:]]*' -v OFS=: '{ sub(/[[:space:]]*[[:digit:]]*$/, “”) } $1=$1' file
sed 的实现很有趣,但可能会更慢(因为 awk 的当前版本具有更好的正则表达式实现)。
sed 's/[[:space:]]*[[:digit:]]*:[[:space:]]/:/g; s/[[:space:]]*[[:digit:]]*[[:space:]]*$//' file
或者如果POSIX字符类不可用...
sed 's/[\t ]*[0-9]*:[\t ]/:/g; s/[\t ]*[0-9]*[\t ]*$//' file
某事告诉我,您的“第一,第二,第三...”可能更复杂,并且可能包含数字...在这种情况下,您可能想尝试用{{1替换*
}}表示 awk 或使用+
表示 sed 。