你好,我每个月都要收集某些人的浏览历史,而我完全是 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
想要降序排列,请使用PROCINFO
sorted_in
@ind_str_asc
PROCINFO["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