Bash 如何缩短长列表的名称

Bash 如何缩短长列表的名称,bash,shell,Bash,Shell,你好 我想知道如何缩短一长串不同名字的列表,使之可读 列表:(假设有所有不同的) 我想得到: simon, g. simon, g. simon, g. simon, g. simon, g. simon, g. simon, g. 提前感谢您提供的任何线索。下面的awk一行将打印出第一列,后面是第二列的第一个字母和一个句点 awk 'BEGIN{FS=OFS=", "} {print $1, substr($2, 1, 1)"."}' input.csv 如果需要,可以使用标准重定向将其

你好

我想知道如何缩短一长串不同名字的列表,使之可读

列表:(假设有所有不同的)

我想得到:

simon, g.
simon, g.
simon, g.
simon, g.
simon, g.
simon, g.
simon, g.

提前感谢您提供的任何线索。

下面的
awk
一行将打印出第一列,后面是第二列的第一个字母和一个句点

awk  'BEGIN{FS=OFS=", "} {print $1, substr($2, 1, 1)"."}' input.csv
如果需要,可以使用标准重定向将其重定向到文件

awk  'BEGIN{FS=OFS=", "} {print $1, substr($2, 1, 1)"."}' input.csv > output.csv

如果您想要纯
bash
解决方案:

while read firstPlusComma last; do
    echo "$firstPlusComma ${last:0:1}."
done < file
读取第一个pluscomma最后一个;做
回显“$firstPlusComma${last:0:1}”
完成<文件

使用
awk

$ awk '{$2=substr($2,1,1)"."}1' file
simon, g.
simon, g.
simon, g.
simon, g.
simon, g.
simon, g.
simon, g.
  • 使用
    substr
    函数将第二个字段修改为第一个字符。根据输出的需要在末尾追加
  • 使用
    1
    打印该行
用perl试试:

perl -lne 'print $1."\." if(/(.*, .).*/)'

使用sed和反向引用

sed -r -e "s/^([^,]+), ([a-zA-Z]).*/\1, \2./g" < <file containing list>
sed-r-e“s/^([^,]+),([a-zA-Z])./\1,2./g”<

+1击败了我。这可能是完成任务的最好方法。@JS웃 谢谢但是,从性能角度来看,我确信您的
awk
解决方案要快得多;请注意,字符串位置在
awk
中以1开头(不过,您的解决方案仍然有效)。谢谢@mklement0的精彩捕捉。固定的。根据手册
如果start小于1,substr()将其视为1。(POSIX没有指定在这种情况下要做什么:Brian Kernighan的awk就是这样做的,因此gawk也这样做。)
,可能这就是它工作的原因
:)
您还可以建议使用
perl-pe的/().*/$1./'文件
sed -r -e "s/^([^,]+), ([a-zA-Z]).*/\1, \2./g" < <file containing list>