根据输入文件批量创建具有名称和内容的文件

时间:2018-09-03 21:31:05

标签: bash awk sed

我是一个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

2 个答案:

答案 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