Bash脚本 - 仅在一列中更改值

时间:2018-01-21 18:36:20

标签: linux bash shell

我有1个文件,例如

12341234 3,0
12341342 4,0

我如何打印:

abcdabcd 3,0
abcdacdb 4,0

cat $1 | tr 1234 abcd

更改第1列和第2列。如何仅更改1列并打印所有列?

4 个答案:

答案 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<()语法是一种基础,但pastecuttr工具所需的功能都是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