我正在尝试在Linux中进行一些文本文件操作。
我有一个名为 names 的文件.txt如下所示:
A1
X12
B4
Y5
C10
Z23
B8
C3
Z6
我需要它看起来像这样:
A01
B04
B08
C03
C10
X12
Y05
Z06
Z23
目标:我需要将个位数归零,然后按字母顺序排列结果,并保存到文件中sorted_names.txt
我想我需要先计算每行的字符数,如果字符数小于 2,则添加一个零。 最后,我需要按字母顺序排序。
对于初学者来说,我想我这样做是为了计算每行的字符数:
cat names.txt | while read line
do
count=$(echo $line | wc -c)
echo $line $count
done
然后我的想法是循环计数:
for COUNT in $count
if [( $COUNT = "3" )];
then
echo doZeroPadHere
fi
仅使用内置的 Bash 功能对您来说很重要吗?因为它似乎更容易使用sed
和sort
:
<names.txt sed 's/^([A-Z])([0-9])$/102/' | sort >sorted_names.txt
这是一个仅使用 Bash 和 sort
的解决方案:
while read line
do
printf "%s%02dn" ${line:0:1} ${line:1}
done <names.txt | sort >sorted.txt
这会从names.txt
中读取行,并将每个行拆分为第一个字符(${line:0:1}
)和第一个字符(${line:1}
)之后的其余行。它使用 printf
(更多详细信息)逐字打印第一个字符,并将行的其余部分打印为 0 填充的数字。它从names.txt
重定向其输入(避免无用地使用cat
),将输出通过管道传输到sort
,并将其重定向到sorted.txt
。
以下是使用 awk
和 sort
的一种方法:
awk '{ printf "%s%02dn", substr($0,0,1), substr($0,2) | "sort" }' file
结果:
A01
B04
B08
C03
C10
X12
Y05
Z06
Z23
这里有一个Perl方法可以做到这一点:
perl -lpe's/^([A-Z])(d)$/${1}0$2/' names.txt
对于每一行,如果它正好匹配一个字母和一个数字,请将其更改为字母、零和数字。 然后打印。