使用unix shell脚本将数字拆分并存储在不同的文件中

时间:2016-09-06 18:21:43

标签: bash shell unix awk

我有一个名为" list.txt"的文件。其中包含以下几行数字。

31056780
31909020
31092320
61093190
61094592
45090280
45902902

我现在需要以" 31"开头的所有行并将它们存储在另一个文件调用file31.txt中,取所有以" 61"开头的行。并将它们存储在file61.txt中,取出以" 45"开头的所有行将其存储在file45.txt

file31.txt将包含。

31056780
31909020
31092320

file61.txt将包含。

61093190
61094592

file45.txt将包含。

45090280
45902902

我为所有3个人尝试过这个命令,但它没有按照我的意愿去做。

awk -F\" '/31*/ {print $0}' list.txt > file31   
awk -F\" '/61*/ {print $0}' list.txt > file61
awk -F\" '/45*/ {print $0}' list.txt > file45

4 个答案:

答案 0 :(得分:3)

您可以在单个awk脚本中使用输出重定向。它可以通过连接该行的前两个字符来构造文件名。

awk '{ fn = "list" substr($0, 1, 2) ".txt"; print > fn }' list.txt

答案 1 :(得分:1)

您可以使用grep或sed过滤具有匹配模式的行,例如:

sed '/^31/!d' list.txt > list31.txt

或者在你想要的每个数字的for循环中:

for n in "31" "45" "61"; do sed '/^'"$n"'/!d' list.txt > list$n.txt; done

希望它有所帮助。

答案 2 :(得分:0)

您可以使用:

awk '/^31/{print > "file31"} /^45/{print > "file45"} /^61/{print > "file61"}' file

答案 3 :(得分:-1)

for i in `cat list.txt | cut -c1-2 | uniq`; do cat list.txt | grep -P ^${i} > file${i}.txt; done

此命令工作正常,通用性足以适用于所有情况。

现在让我们了解它的工作原理。

cat list.txt | cut -c1-2 | uniq

  

31

     

45

     

61

接下来,我们循环使用这些唯一标识符来创建新文件 cat list.txt | grep -P ^${i}

grep -P查找部分匹配的字符串 - 这里^ - 表示我们只在行的开头查看这个部分字符串。