对目录中多个文件的内容进行排序的脚本

对目录中多个文件的内容进行排序的脚本

你好,我每个月都要收集某些人的浏览历史,而我完全是 Linux 菜鸟。我想先访问sort网站,然后运行uniq -u。我使用的程序的输出如下所示 -

==================================================
URL               : http://example.com/
==================================================
==================================================
URL               : http://example.com/en
==================================================
==================================================

/history例如bob.txt,在名为 等 的文件夹中,大约有 30 个这样的文件。tim.txt是否可以编写一个脚本,对目录中所有文件的内容进行排序,删除所有符号=,删除重复项并将结果保存在新文件中bob.doc,例如tim.doc

目前我正在手动运行sort bob.txt | uniq -u > bob.doc

答案1

这有效,至少对于您给出的示例而言:

for i in *.txt; do
  sed '/=/d;s/URL *: //' "$i" |
  sort -u > "${i%%.txt}".doc
done

解释

  • for i in *.txt; do … done– 循环遍历.txt当前目录下的每个文件
  • sed '/=/d;s/URL *: //'– 删除以 开头的每一行=,删除每一行 URL 之前的内容
  • sort -u– 排序并仅输出相等运行中的第一个
  • > "${i%%.txt}".doc– 将输出重定向到bob.doc例如输入文件bob.txt(使用参数扩展

答案2

GNU awk(Ubuntu 中的默认设置)——单独:

awk -vFPAT='https?:[^\\s]+' 'BEGIN {PROCINFO["sorted_in"]="@ind_str_asc"} \
            /\w+/{a[$1]} END{for(i in a) print i}' *.txt
  • 假设所有输入文件都以 结尾.txt;如果不是,则在 glob 模式中进行必要的更改*.txt

  • 变量FPAT使用正则表达式设置字段定义,我们已将记录的一部分定义为以 开头,之后http为可选s,然后是:,直到下一个空格,通过正则表达式模式作为字段https?:[^\\s]+'

  • awk仅支持默认情况下未排序的关联数组(好吧,根据内部哈希排序 - 这是一个实现细节),我们使用具有值的关联数组根据索引字符串定义数组的排序顺序。如果你a想要降序排列,请使用PROCINFOsorted_in@ind_str_ascPROCINFO["sorted_in"]="@ind_str_asc"PROCINFO["sorted_in"]="@ind_str_desc"

  • 最后,END{for(i in a) print i}遍历数组元素a并打印已排序的数组键。


如果要将输出保存到文件,例如out.txt

awk -vFPAT='https?:[^\\s]+' 'BEGIN {PROCINFO["sorted_in"]="@ind_str_asc"} \
            /\w+/{a[$1]} END{for(i in a) print i}' *.txt >out.txt

编辑:

如果要将每个正在处理的文件的输出保存在相应的文件中,并将.txt扩展名替换为.doc,则可以利用awk变量FILENAME获取文件名、sub(".txt$", ".doc", FILENAME执行重命名并ENDFILE在每个文件处理结束时执行数组处理:

awk -vFPAT='https?:[^\\s]+' 'BEGIN {PROCINFO["sorted_in"]="@ind_str_asc"} \
           /\w+/{a[$1]} ENDFILE{sub(".txt$", ".doc", FILENAME); \
                  for(i in a) print i > FILENAME}' *.txt

相关内容