有一个多行文本文件,如下所示:
djfldfjd:lisa
ldj:roma
dkjdkjflddlsdkjdlkj:kathy
ldadkjfdsldkjdlkfjdlkkkkkkkkkkkkkkkkkkkkl:purple
dkjdljl:christine
kdllkldkjhhhhhhhhhhhhhhh:george
ldkjfdl:kathy
现在我需要的只是一个脚本来处理上述文本文件的所有行并比较冒号后出现的字符串并获取冒号后的重复字符串并在冒号之前打印这些字符串。
所以我尝试使用下面的脚本,但出现下面提到的错误:
#!/usr/bin/sh
input="test.txt"
cat $input | while read line; do output= $(echo $line | cut -d":" -f2); done
for (( i = 0 ; i < "${#output[@]}" ; i++ ))
{
echo ${output[i]}
}
错误信息:
./compare.sh: line 11: test1: command not found
任何帮助将不胜感激。谢谢。
答案1
您的脚本未使用sh
语法。如果有什么看起来更像是 ksh 和 zsh 语法的混合。对于基本语法检查,您可能需要使用 shellcheck(可在线获取或作为可安装在系统上的独立实用程序)。
但无论如何要处理文本,你不想使用 shell 循环。
您宁愿使用文本处理工具。在这里,对于在具有固定分隔符的字段中格式化的文本,显而易见的是awk
:
#! /usr/bin/sh -
input=test.txt
awk -F: '
second_pass {if (count[$2] > 1) print $1; next}
{count[$2]++}' "$input" second_pass=1 "$input"
答案2
明白了,所以我的新补充是:
awk -F: 'second_pass {if (count[$2] > 1) print NR-1 "," $1; next} {count[$2]++}' "$input" second_pass=1 "$input"
有用!干杯!!