零填充和 Linux Shell 脚本



我正在尝试在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 功能对您来说很重要吗?因为它似乎更容易使用sedsort

<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

以下是使用 awksort 的一种方法:

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

对于每一行,如果它正好匹配一个字母和一个数字,请将其更改为字母、零和数字。 然后打印。

相关内容

  • 没有找到相关文章

最新更新