将文件分解为字符串,每个文件根据首字母分为单独的文件。BASH

将文件分解为字符串,每个文件根据首字母分为单独的文件。BASH

好吧,我有一个包含数千个字符串的文件。每个字符串都在一行中。我想编写一个脚本,让我能够获取此文件,将其命名为list.txt,并从每行中取出项目,并根据第一个字母或数字将其放入单独的文件中。例如,假设文件的前几行如下所示:

cheese
pizza
pepperoni
lettuce
grahamCrackers
0-0Foods
chicken
lentils
1-2Items

我需要将其分解成以下几个部分:

文本文件

cheese
chicken

文本文件

grahamCrackers

編輯.txt

lettuce
lentils

頁面

pizza
pepperoni

0.txt

0-0Foods

1.txt

1-2Items

我想在 OS X 上使用 BASH 实现这一点。谢谢。

哦,如果有帮助的话。每行上的项目永远不会有空格,它们将始终包含在一个单词中。例如(永远不要使用 Chicken Soup,而是使用 Chicken-Soup)

答案1

尝试这个

OLDIFS=$IFS
IFS='
'
typeset -a file
file=($(cat list.txt))
for i in "${file[@]}"; do
    echo $i >> ${i:0:1}.txt
done
IFS=$OLDIFS

注意,IFS 部分通常不是必需的。另外,我在 Linux 上的 Zsh 4.3.17 和 Bash 4.2.37 上对其进行了测试。

它的作用是声明一个数组,将文件的内容分配给该数组,然后循环遍历数组的每个元素,因此每一行都将该元素回显到文件中,并在文件中附加第一个字母的名称和“.txt”。

答案2

您只需使用 gawk 并简化事情:

gawk '{n=substr($1,0,1); print >> n".txt"}' file.txt
  • n=substr($1,0,1)从第一个字段()的第一个位置(0)开始获取长度为 1 的子字符串,$1并将其保存到名为的变量中n

  • print >> n".txt"将把每一行附加( )到名为(其中是首字母)>>的文本文件中。n.txtn

要对前两个字母执行相同的操作,只需更改长度substr

gawk '{n=substr($1,0,2); print >> n".txt"}' file.txt

答案3

#!/bin/bash

while read line
do
    firstChar=${line:0:1}
    fileName=${firstChar}.txt
    if [ -e ${fileName} ];then
    touch ${fileName}
     fi
    echo ${line} >> ${fileName}
done < list.txt

上述脚本从文件中读取每行的第一个字符list.txt。然后尝试创建一个包含该字符 + “.txt” 的文件,并将每行附加到list.txt相应的字符 + “.txt” 文件中。

相关内容