如何在Bash中合并两个文档?

时间:2014-11-19 22:35:46

标签: linux bash shell command

现在我有一个bash shell脚本,它接受带有语法的文本文件的输入,例如" Smith,Bob"。最终目标是获取名字的第一个字母并附加姓氏的前7个字符。我现在正处于泡菜中。

echo "Extracting first letter" 
cut  -d "," -f2  $1 > first.txt

cut -b2 first.txt > second.txt
echo "First letter extracted" 

echo "Extracting 7 characters"
cut -d "," -f1 $1 > letters.txt

cat second.txt | tr '[:upper:]' '[:lower:]' > lowernames.txt

我有两个文件,一个带有第一个字母,另一个带有前7个字符,但不能将两个文件组合在一起。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您无需任何外部流程即可完成此操作:

while read surname firstname
do 
    surname="${surname%,}"
    echo "${firstname:0:1}${surname:0:7}"
done

查看 Live On IdeOne

输入

Smith, Bob
Doe, John
Snow, John
Pattitucci, John

输出

BSmith
JDoe
JSnow
JPattitu

答案 1 :(得分:1)

以下是三个解决方案,一个使用sed,一个使用awk,另一个使用python

使用sed

这是一个sed解决方案。使用与sehe相同的测试文件:

$ cat file
Smith, Bob
Doe, John
Snow, John
Pattitucci, John
$ sed -E 's/([^,]{1,7})[^,]*,\s*(\S).*/\2\1/' file
BSmith
JDoe
JSnow
JPattitu

如何运作

这个想法是将姓氏的前7个字母捕获到组1,将姓氏的第一个字母捕获到组2.正则表达式由以下部分组成:

  • ([^,]{1,7})

    最多可捕获姓氏的七个字符。

  • `[^,] *,

    这匹配姓氏的前七个后面的任何字符和后面的逗号。

  • \s*

    这匹配逗号后面的任何空格

  • (\S)

    这匹配名字的第一个字符

  • .*

    这匹配名字的任何剩余字符。

使用awk

$ awk -F', *' '{print substr($2,1,1) substr($1,1,7)}' file
BSmith
JDoe
JSnow
JPattitu

如何运作

  • -F', *'

    这将字段分隔符声明为逗号后跟零个或多个空格

  • substr($1,1,7)

    这将选择姓氏的前七个字符

  • substr($2,1,1)

    这将选择名字的第一个字符

使用python

$ python3 -c 'for line in open("file"): last, first=line.strip().split(", "); print(first[:1] + last[:7])'
BSmith
JDoe
JSnow
JPattitu

答案 2 :(得分:0)

使用awk:

 awk -F ', ' '{printf("%s%s\n",substr($2,1,1),subsstr($1,1,7))}' file

输入:

Smith, Bob
Doe, John
Snow, John
Pattitucci, John

输出:

BSmith
JDoe
JSnow
JPattitucci

输入文本被拆分为','而substr将提取第二个字段的第一个字符