您好我们正在尝试使用Bourne shell脚本删除.txt文件中的重复项。
示例文件内容为
asdfg, test
efgrso, test
asdfg, test
asdfg, test
,所需的输出是
asdfg, test
efgrso, test
我们尝试了下面的代码,awk命令和sort命令都不起作用。感谢你的帮助。
for dir in FilePath/test/*; do
echo "Directory $dir";
cd $dir;
## /usr/xpg4/bin/awk '!seen[$0]++' testfile.txt;
sort -u testfile.txt;
cd ..
done
答案 0 :(得分:2)
您可以尝试awk
:
awk '!a[$0]++' file
如果行$0
已经是数组a
的一部分,则不会打印该行。
如果要删除目录中每个文件的重复项,可以使用:
find FilePath/test -type f -name testfile.txt -exec awk '!a[$0]++' {} \;
如果要删除目录中所有文件的重复项,可以使用:
find FilePath/test -type f -name testfile.txt -print | xargs awk '!a[$0]++'
答案 1 :(得分:0)
即使您将变量命名为dir,......
for dir in FilePath/test/*; do
echo "Directory $dir";
cd $dir;
shell不会接受此限制并尝试输入文件FilePath / test / foo.bar
sort -u testfile.txt;
刚刚登机?
cd ..
如果cd失败了,cd ..会上升一个目录。
done
改进:
for dir in FilePath/test/*/; do
# ^ is a dir
echo "Directory $dir"
cd "$dir" # quote
sort -u testfile.txt
cd ..
done
也许你没有得到许可?
for dir in FilePath/test/*/; do
echo "Directory $dir"
cd "$dir"
changefailed=$?
sort -u testfile.txt
if (( ! $changefailed )) ; then
cd ..
fi
done
更好:根本不要改变:
for dir in FilePath/test/*/; do
echo "Directory $dir"
sort -u "${dir}/testfile.txt"
done
答案 2 :(得分:0)
只使用bash
for dir in FilePath/test/*; do
if [ -d "${dir}" ] ; then
echo "Directory $dir";
cd $dir;
sort -u file > output.txt # write file contents without dupes to output.txt
cd ..
fi
done
答案 3 :(得分:0)
您无法过滤文件,需要创建一个中间文件:
tmp_file="$(tempfile)"
sort -u testfile.txt > "${tmp_file}"
mv "${tmp_file}" testfile.txt
rm "${tmp_file}"
或者,如果您有GNU awk:
gawk -i inplace '!seen[$0]++' testfile.txt