Reputation: 53
I have 1 file, for example
12341234 3,0
12341342 4,0
How can I print:
abcdabcd 3,0
abcdacdb 4,0
cat $1 | tr 1234 abcd
changes both column 1 and 2. How to change only 1 column and print all columns?
Upvotes: 4
Views: 1559
Reputation: 295315
One way to do this is to split the columns and then rejoin them with paste
:
paste <(cut -d' ' -f1 <"$1" | tr 1234 abcd) <(cut -d' ' -f2- <"$1")
The <()
syntax for process substitution is a bashism, but the required functionality from paste
, cut
and tr
tools is all POSIX-specified; thus, the only thing we require to run that isn't part of the POSIX standard is bash itself.
Upvotes: 4
Reputation: 92854
Awk
solution:
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
The output:
abcdabcd 3,0
abcdacdb 4,0
Upvotes: 0
Reputation: 88583
With GNU sed:
sed 'h;s/.* //;x;s/ .*//;y/1234/abcd/;G;s/\n/ /' file
Output:
abcdabcd 3,0 abcdacdb 4,0
See: man sed
Upvotes: 2
Reputation: 241808
Perl to the rescue:
perl -lane '$F[0] =~ tr/1234/abcd/; print "@F"' -- file
-n
reads the input line by line-l
removes newlines from input and adds them to printed lines-a
splits automatically each line on whitespace into the @F arraytr
operator works similarly to tr
, but you can bind it by the binding operator =~
to only operate on the first column ($F[0]
).Upvotes: 3