我正在尝试以允许第二个文件中的行以以开头的第一个文件中的行(但附加了不需要的垃圾)的方式比较两个文件。
考虑以下代码:
printf '%s\n' 5234 2234 3234 4234 1234 >NumsOnFile.txt
printf '%s\n' 423499 1234 223401 3234 >UserNums.txt
我想生成两个输出文件:good.txt
,两个文件中都有数字(甚至只是一个子字符串),以及bad.txt
,其中数字在UserNums.txt
中但不存在NumsOnFile.txt
。
我目前分两个阶段进行。我目前在第一阶段的尝试如下所示:
sort -n UserNums.txt > a
sort -n NumsOnFile.txt > b
awk '!a[$0]++' a > A
awk '!a[$0]++' b > B
comm -23 A B > bad.txt
comm -12 A B > good.txt
我希望good.txt
包含以下内容:
1234
3234
...和bad.txt
包含以下内容:
423499
223401
然后,我正在处理bad.txt
,查看在删除每行的最后一个字符之后是否找到任何匹配项:
read file
if [ -s bad.txt ]
then
sed 's/.$//' bad.txt > checker.txt # removes last character from each line
sort -n checker.txt > X
comm -23 X B > checker.txt
comm -12 X B >> good.txt
cat checker.txt > bad.txt
else
echo "File is empty"
fi
在第二阶段之后,good.txt
现在应该具有与两个文件都匹配的所有数字(即使它们只是UserNums.txt中的子字符串):
1234
2234
3234
4234
...而bad.txt
应该具有不匹配的原始数字:
423499
223401
我认为我的逻辑是正确的,但是没有使用正确的命令或未正确使用的命令。但是if
可能会陷入困境。
答案 0 :(得分:0)
如果我正确理解了您的问题,那么也许应该可以解决问题
#!/bin/bash
# All files are assumed to be in the same directory. Please modify the paths if necessary.
# Opening files for writing
exec 3>./Bad.txt
exec 4>./Good.txt
exec 5>./correction.sed
#Creating an array for the account numbers.
while read line; do
accountNumber[$line]=$line
done < ./NumsOnFile.txt
# Comparing the user's file with your account file
while read line; do
# That takes only the first 4 characters. If your account number are of a different length please modify
accUser=${line:0:4}
if [[ ${accountNumber[$accUser]} -ne $line ]]; then
#if different then write the bad file and the script to correct the original file
echo $line >&3
echo "s|$line|$accUser|g" >&5
else
#if same, just write the good file
echo $line >&4
fi
done < ./UserNums.txt
# Closing files
exec 3>&-
exec 4>&-
exec 5>&-
# Executing sed script to correct the input file
sed -i.bck --file=./correction.sed ./UserNums.txt
希望它会有所帮助。
经过编辑以考虑到Charles的评论
答案 1 :(得分:0)
您可以使用以下命令进行输出
cat NumsOnFile.txt UserNums.txt | cut -c1-4 |sort | uniq -d > good.txt
grep -vFxf NumsOnFile.txt UserNums.txt > bad.txt