在bash中的特定列中剪切字符串

时间:2015-03-04 01:10:25

标签: bash awk

如何在第三个字段中剪切前导零,使其只有6个字符?

 xxx,aaa,00000000cc
 rrr,ttt,0000000yhh

期望的输出

  xxx,aaa,0000cc
  rrr,ttt,000yhh

3 个答案:

答案 0 :(得分:3)

或者这是使用awk的解决方案

 echo " xxx,aaa,00000000cc
 rrr,ttt,0000000yhh"|awk -F, -v OFS=, '{sub(/^0000/, "", $3)}1'

<强>输出

 xxx,aaa,0000cc
 rrr,ttt,000yhh

awk使用-F(或FieldSeparator的FS),你必须使用OFS作为OutputFieldSeparator。

sub(/srchtarget/, "replacmentstring", stringToFix)使用正则表达式在(0)前面查找4 ^个第三个字段($ 3)。

1print语句的简写。该脚本的简写版本将是

echo " xxx,aaa,00000000cc
 rrr,ttt,0000000yhh"|awk -F, -v OFS=, '{sub(/^0000/, "", $3);print}'
 # ---------------------------------------------------------^^^^^^

这一切都与awk的/pattern/{action}成语有关。

IHTH

答案 1 :(得分:1)

如果你可以假设总有三个字段并且想要剥离第三个字段中的前四个零,你可以使用这样的怪物:

$ cat data
xxx,0000aaa,00000000cc
rrr,0000ttt,0000000yhh

$ cat data |sed 's/\([^,]\+\),\([^,]\+\),0000\([^,]\+\)/\1,\2,\3/
xxx,0000aaa,0000cc
rrr,0000ttt,000yhh

另一种更灵活的解决方案,如果你不介意管道进入Python:

cat data | python -c '
import sys
for line in sys.stdin():
  print(",".join([f[4:] if i == 2 else f for i, f in enumerate(line.strip().split(","))]))
'

这表示“删除第三个字段的前四个字符,但保持所有其他字段不变”。

答案 2 :(得分:0)

使用awk s substr也应该有效:

awk -F, -v OFS=, '{$3=substr($3,5,6)}1' file
xxx,aaa,0000cc
rrr,ttt,000yhh

只需从字段6中的5位置获取3个字符,然后将其设置回字段3