好吧,我有一个包含数千个字符串的文件。每个字符串都在一行中。我想编写一个脚本,让我能够获取此文件,将其命名为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.txt
n
要对前两个字母执行相同的操作,只需更改长度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” 文件中。