我有1个文件,例如
12341234 3,0
12341342 4,0
我如何打印:
abcdabcd 3,0
abcdacdb 4,0
cat $1 | tr 1234 abcd
更改第1列和第2列。如何仅更改1列并打印所有列?
答案 0 :(得分:3)
Perl救援:
perl -lane '$F[0] =~ tr/1234/abcd/; print "@F"' -- file
-n
逐行读取输入行-l
从输入中删除换行符并将其添加到打印行-a
自动将空格上的每一行拆分为@F数组tr
运算符与tr
的工作方式类似,但您可以通过绑定运算符=~
将其绑定到仅对第一列($F[0]
)进行操作。答案 1 :(得分:3)
执行此操作的一种方法是拆分列,然后使用paste
重新加入:
paste <(cut -d' ' -f1 <"$1" | tr 1234 abcd) <(cut -d' ' -f2- <"$1")
process substitution的<()
语法是一种基础,但paste
,cut
和tr
工具所需的功能都是POSIX指定的;因此,我们唯一需要运行的不是POSIX标准的一部分就是bash本身。
答案 2 :(得分:2)
使用GNU sed:
sed 'h;s/.* //;x;s/ .*//;y/1234/abcd/;G;s/\n/ /' file
输出:
abcdabcd 3,0 abcdacdb 4,0
请参阅:man sed
答案 3 :(得分:0)
Awk
解决方案:
awk 'BEGIN{ split("abcd", a, "") }
{
len=split($1, b, "");
for (i=1; i<=len; i++) printf("%s",(b[i] in a? a[b[i]] : b[i]));
print FS $2
}' file
输出:
abcdabcd 3,0
abcdacdb 4,0