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

cut string in a specific column in bash

如何删除第三个字段中的前导零,使其只有 6 个字符?

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

期望的输出

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

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

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

$ cat data |sed 's/\([^,]\+\),\([^,]\+\),0000\([^,]\+\)/,,/
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(","))]))
'

这表示 "remove the first four characters of the third field but leave all other fields unchanged"。

或者这里有一个使用 awk 的解决方案

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

输出

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

awk 使用 -F(或 FS 表示 FieldSeparator)并且您必须使用 OFS 表示 OutputFieldSeparator)。

sub(/srchtarget/, "replacmentstring", stringToFix)是用正则表达式在(^)第三个字段($3).

前面找4个0

1print 语句的 shorthand。该脚本的普通版本是

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

都与awk的/pattern/{action}习语有关。

IHTH

使用 awks substr 也应该有效:

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

它只是从字段 3 中的 5 位置提取 6 个字符并将其设置回字段 3