如何在Bourn shell脚本中删除文本文件中的重复行?

时间:2018-04-16 08:36:59

标签: bash shell unix

您好我们正在尝试使用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

4 个答案:

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