我试图删除每行的第6,7和8个字符。
以下是包含文字格式的文件。
实际输出..
#cat test
18:40:12,172.16.70.217,UP
18:42:15,172.16.70.218,DOWN
在格式化后期望下面。
#cat test
18:40,172.16.70.217,UP
18:42,172.16.70.218,DOWN
即使我尝试过以下,也没有运气
#awk -F ":" '{print $1":"$2","$3}' test
18:40,12,172.16.70.217,UP
#sed 's/^\(.\{7\}\).\(.*\)/\1\2/' test { Here I can remove only one character }
18:40:1,172.16.70.217,UP
即使裁员也失败
#cut -d ":" -f1,2,3 test
18:40:12,172.16.70.217,UP
需要删除每一行中的字符,如第6,第7,第8
建议
答案 0 :(得分:5)
使用GNU剪切,您可以使用--complement
开关删除字符6到8:
cut --complement -c6-8 file
否则,您可以自己选择其余的角色:
cut -c1-5,9- file
即。字符1到5,然后9到每行的末尾。
使用awk你可以使用子串:
awk '{ print substr($0, 1, 5) substr($0, 9) }' file
或者您可以编写正则表达式,但结果会更复杂。
例如,要从第一个以逗号分隔的字段中删除最后三个字符:
awk -F, -v OFS=, '{ sub(/...$/, "", $1) } 1' file
或者,将sed与捕获组一起使用:
sed -E 's/(.{5}).{3}/\1/' file
捕获前5个字符并在替换中使用它们,然后删除下一个3。
答案 1 :(得分:3)
它是一个结构化的文本,如果你可以描述它们,为什么要计算这些字符?
$ awk '{sub(":..,",",")}1' file
18:40,172.16.70.217,UP
18:42,172.16.70.218,DOWN
删除秒。
答案 2 :(得分:2)
以下解决方案是通用的,并且不承担任何格式的知识。他们只删除任何一行的字符6,7和8。
<强> const applicant = result.applicant || {}
if (applicant_id !== `${applicant._id}`) {
console.log('redirect user');
}
强>
sed
sed 's/.//8;s/.//7;s/.//6' <file> # from high to low sed 's/.//6;s/.//6;s/.//6' <file> # from low to high (subtract 1) sed 's/\(.....\).../\1/' <file> sed 's/\(.{5}\).../\1/' <file>
::将s/BRE/replacement/n
n
替换为BRE
<强> replacement
强>
awk
这是相同的3倍,删除字段分隔符awk 'BEGIN{OFS=FS=""}{$6=$7=$8="";print $0}' <file>
awk -F "" '{OFS=$6=$7=$8="";print}' <file>
awk -F "" '{OFS=$6=$7=$8=""}1' <file>
让FS
假定字段为字符。我们清空字段awk
和6,7
,并使用输出字段分隔符8
重新打印该行,该分隔符为空。
<强> OFS
强>
cut
答案 3 :(得分:2)
只是为了好玩,perl,你可以在其中分配一个子字符串
perl -pe 'substr($_,5,3)=""' file
答案 4 :(得分:0)
使用awk:
echo "18:40:12,172.16.70.217,UP" | awk '{ $0 = ( substr($0,1,5) substr($0,9) ) ; print $0}'
问候!
答案 5 :(得分:0)
如果你在bash上运行,你可以使用它的字符串操作功能,而不必调用awk,sed,cut或任何二进制文件:
while read STRING
do
echo ${STRING:0:5}${STRING:9}
done < myfile.txt
$ {STRING:0:5}代表字符串的前五个字符,$ {STRING:9}代表第9个字符,所有剩余的字符代表该行的结尾。这样你就可以剪掉字符6,7和8 ......