是否有办法(在一行内)将查找和替换限制在制表符分隔的.txt文件的特定列中?
例如:
perl -pe 's/A/B/g;'
但是只发现并替换了A'用' B'在第2列中并忽略A的所有其他实例,转换为:
1 A A2
2 A A
3 B B1
4 A B
5 A A
6 B A3
7 A A
8 C A
9 E B
10 D B
11 A C6
12 A G
13 B L
14 A E
15 B A
16 A A
分为:
1 B A2
2 B A
3 B B1
4 B B
5 B A
6 B A3
7 B A
8 C A
9 E B
10 D B
11 B C6
12 B G
13 B L
14 B E
15 B A
16 B A
答案 0 :(得分:2)
这样的东西会变换制表符分隔行的第二个字段。
perl -lne '@row = split /\t/; $row[1] =~ s/A/B/; print join ( "\t", @row );'
答案 1 :(得分:2)
你可以这样写:
perl -lane '$F[1]=~tr/A/B/;print join("\t", @F)' file
答案 2 :(得分:1)
$ sed 'h;s/^.*\t\(.*\)\t.*$/\1/;y/A/B/;G;s/\(.*\)\n\(.*\t\).*\(\t.*\)/\2\1\3/' infile
1 B A2
2 B A
3 B B1
4 B B
5 B A
6 B A3
7 B A
8 C A
9 E B
10 D B
11 B C6
12 B G
13 B L
14 B E
15 B A
16 B A
说明:
# Copy pattern space to hold space
h
# Remove first and third column from pattern space
s/^.*\t\(.*\)\t.*$/\1/
# Transliterate A to B (can use s/// for more complex substitutions)
y/A/B/
# Append hold space to pattern space
G
# Replace second column with transliterated value
s/\(.*\)\n\(.*\t\).*\(\t.*\)/\2\1\3/
$ paste <(cut -f 1 infile) <(cut -f 2 infile | tr A B) <(cut -f 3 infile)
这会使用paste
,cut
和tr
进行流程替换。当然,tr
可以替换为更复杂的更改的替代品。