我是一个Mac OS用户,试图批量创建一堆文件。我有一个文本文件,其中包含数百个术语/主题,例如:
hydrogen
oxygen
nitrogen
carbon
etcetera
我想以编程方式用该主题列表生成的文本文件填充目录。例如,“ hydrogen.txt”和“ oxygen.txt”等,每个文件都通过遍历list_of_names.txt文件的各行来创建。有些行是一个单词,但其他行是两个或三个单词(例如:“一氧化碳”)。我已经弄清楚该怎么做:
awk 'NF>0' list_of_names.txt | while read line; do touch "${line}.txt"; done
此外,我需要在每个文件中创建两行内容,并且内容既是静态的又是动态的...
# filename
#elements/filename
......在上面的示例中,所有创建的文件中的井号(“#”)和“ elements /”都相同,但是“ filename”将是可变的(例如:“氢”代表“ “ hydrogen.txt”和“ oxygen”代表“ oxygen.txt”等)。另一个问题是,如果在第二行内容中根本没有空格,则必须有一个尾随的英镑符号。例如:
# filename
#elements/carbon monoxide#
...虽然最后一部分不是一个破坏者,但我可以使用grep修改list_of_names.txt,以使诸如“一氧化碳”之类的短语变为“ carbon_monoxide”,并在以后处理它的影响。 (但是,如果要保留这些空间很容易,我宁愿这么做。)
经过几个小时的搜索并尝试使用sed,awk等,我被困在一个目录中,该目录中包含正确的filename.txt格式的文件,但是我对此一无所知。大多数情况下,我认为我的努力失败了,因为我找到的解决方案是使用我不熟悉的命令,并且这些命令是针对GNU编写的,无法在Mac OS的Terminal中正确执行。
我可以分多个步骤进行处理(即先制作所有files.txt,然后再执行第二步以填充文件的内容),或作为一个命令来制作文件及其所有同时显示内容(从人类时标“同时”显示)。
我的可怕伪代码(IN CAPS)显示如下2步:
awk 'NF>0' list_of_names.txt | while read line; do touch "${line}.txt"; done
awk 'NF>0' list_of_names.txt | while read line; OPEN "${line}.txt" AND PRINT "# ${line}\n#elements/${line}"; IF ${line} CONTAINS CHARACTER " " PRINT "#"; done
答案 0 :(得分:1)
您可以使用一个简单的Bash循环并一次性创建文件:
@echo off
setlocal enabledelayedexpansion
CD c:\"destination"\somefolder
set n=0
for %%f in (*.*) do (
set /a n+=1
set "file[!n!]=%%f"
)
set /a rand=(n*%random% %%4) /4
move "!file[%rand%]!" C:\destination\somefolder
pause
awk来做:
#!/bin/bash
while read -r name; do # loop through input file content
[[ $name ]] || continue # skip empty lines
output=("# $name") # initialize the array with first element
trailing=
[[ $name = *" "* ]] && trailing="#" # name has spaces in it
output+=("#elements/$name$trailing") # name doesn't have a space
printf '%s\n' "${output[@]}" > "$name.txt" # write array content to the output file
done < list_of_names.txt
答案 1 :(得分:1)
在awk中完成整个工作会比在bash中isn't really suited to processing text like this产生更好的性能。
在我看来,这应该可以满足您指定的要求:
awk '
{
out=$0 ".txt"
printf "# %s\n#elements/%s%s\n", $0, $0, (/ / ? "#" : "") >> out
close(out)
}
' list_of_subjects.txt
尽管您可以将其缩小为单层:
awk '{printf "# %s\n# elements/%s%s\n",$0,$0,(/ /?"#":"")>($0".txt");close($0".txt")}' list_of_subjects.txt