【发布时间】:2011-05-03 23:56:06
【问题描述】:
我有两个文件:
文件 1
dsf
sdfsd
dsfsdf
文件 2
ljljlj
lkklk
dsf
sdfsd
dsfsdf
我想显示文件 2 中的内容,而不是文件 1 中的内容,因此文件 3 应该是这样的
ljljlj
lkklk
【问题讨论】:
标签: bash file scripting sed awk
我有两个文件:
文件 1
dsf
sdfsd
dsfsdf
文件 2
ljljlj
lkklk
dsf
sdfsd
dsfsdf
我想显示文件 2 中的内容,而不是文件 1 中的内容,因此文件 3 应该是这样的
ljljlj
lkklk
【问题讨论】:
标签: bash file scripting sed awk
grep -Fxvf file1 file2
标志的含义:
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.
-x, --line-regexp
Select only those matches that exactly match the whole line.
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing.
【讨论】:
-n可以添加到不同的行编号
grep -m 1 -Fnxvf file1 file2
你可以试试
grep -f file1 file2
或
grep -v -F -x -f file1 file2
【讨论】:
dsfblah 添加到file2。
grep -F -x修复它
grep -v -f oldfile newfile,否则它什么也不会输出。
您可以使用comm 命令比较两个已排序的文件
comm -13 <(sort file1) <(sort file2)
【讨论】:
comm -1 -3 file1 file2。 1 和 3 两个标志合并为一个。
我成功使用了
diff "${file1}" "${file2}" | grep "<" | sed 's/^<//g' > "${diff_file}"
将差异输出到文件。
【讨论】:
如果您希望它们按特定顺序排列,您可以使用diff
diff file1 file2 | grep ">"
【讨论】:
join -v 2 <(sort file1) <(sort file2)
【讨论】:
A 尝试对Luca 的回答稍作改动,它对我有用。
diff file1 file2 | grep ">" | sed 's/^> //g' > diff_file
请注意,在 sed 中搜索到的模式是 > 后跟一个空格。
【讨论】:
【讨论】:
如果你想使用循环,你可以这样尝试:(diff 和 cmp 效率更高。)
while read line
do
flag = 0
while read line2
do
if ( "$line" = "$line2" )
then
flag = 1
fi
done < file1
if ( flag -eq 0 )
then
echo $line > file3
fi
done < file2
注意:该程序只是为了提供一个基本的见解,如果您不想使用系统调用,例如 diff n comm..
【讨论】:
一个 awk 答案:
awk 'NR == FNR {file1[$0]++; next} !($0 in file1)' file1 file2
【讨论】:
使用 GNU sed:
sed 's#[^^]#[&]#g;s#\^#\\^#g;s#^#/^#;s#$#$/d#' file1 | sed -f- file2
工作原理:
第一个sed 产生如下输出:
/^[d][s][f]$/d
/^[s][d][f][s][d]$/d
/^[d][s][f][s][d][f]$/d
然后它被第二个sed用作sed脚本。
【讨论】: