3

我有一个用冒号分隔的文件,例如

1:2:3:4:5:6:7:8:9:10
11:12:13:14:15:16:17:18:19:20

ETC

每行中的字段数量始终相同

我希望能够屏蔽(用 * 替换字段)该文件每一行的第 x 和第 y 字段。假设我想屏蔽第 5 个和第 7 个字段,以便文件看起来像:

1:2:3:4:*:6:*:8:9:10
11:12:13:14:*:16:*:18:19:20

我怎样才能在 bash 中实现这样的目标?

谢谢

4

4 回答 4

5

像这样让你开始

#!/bin/bash

x=5
y=7

awk -F':' -vX="$x" -vY="$y" 'BEGIN{OFS=FS}{$X="*";$Y="*"}{print}' input

输出:

$ ./fields.sh 
1:2:3:4:*:6:*:8:9:10
11:12:13:14:*:16:*:18:19:20
于 2013-03-08T10:01:00.530 回答
2

一个bash解决方案:

#!/usr/bin/bash

while IFS=: read -a arr
do
         arr[4]='*'
         arr[6]='*'
         (IFS=":";echo "${arr[*]}")
done < file
于 2013-03-08T10:23:16.273 回答
1

我会添加一个 sed 单线。(忽略 bash 变量部分,我使用硬编码值 5 和 7 为例)

sed -r 's/[^:]+:/*:/5;s/[^:]+:/*:/7' file

用你的例子:

kent$  echo "1:2:3:4:5:6:7:8:9:10
11:12:13:14:15:16:17:18:19:20"|sed -r 's/[^:]+:/*:/5;s/[^:]+:/*:/7' 
1:2:3:4:*:6:*:8:9:10
11:12:13:14:*:16:*:18:19:20

带变量:

sed -r "s/[^:]+:/*:/$X;s/[^:]+:/*:/$Y" file
于 2013-03-08T10:23:09.280 回答
0

使用编辑:

 $ printf '%s\n' '1,$ g/./s/\(\([[:digit:]*]*\(:\|$\)\)\{'{4,6}'\}\)[[:digit:]*]*:/\1\*:/' ,p |
 ed -s <(xclip -o)
1:2:3:4:*:6:*:8:9:10
11:12:13:14:*:16:*:18:19:20

w 写出文件。

于 2013-03-08T12:28:45.800 回答