on Linux box I have one file as below A.txt
1
2
3
4
Second file as below B.txt
1
2
3
6
I want to know what is inside A.txt but not in B.txt i.e. it should print value 4
I want to do that on Linux.
on Linux box I have one file as below A.txt
1
2
3
4
Second file as below B.txt
1
2
3
6
I want to know what is inside A.txt but not in B.txt i.e. it should print value 4
I want to do that on Linux.
awk 'NR==FNR{a[$0]=1;next}!a[$0]' B A
didn't test, give it a try
Use comm if the files are sorted as your sample input shows:
$ comm -23 A.txt B.txt
4
If the files are unsorted, see @Kent's awk solution.
You can also do this using grep by combining the -v
(show non-matching lines), -x
(match whole lines) and -f
(read patterns from file) options:
$ grep -v -x -f B.txt A.txt
4
This does not depend on the order of the files - it will remove any lines from A that match a line in B.
(An addition to @rjmunro's answer)
The proper way to use grep
for this is:
$ grep -F -v -x -f B.txt A.txt
4
Without the -F
flag, grep
interprets PATTERN, read from B.txt
, as a basic regular expression (BRE), which is undesired here, and can cause troubles. -F
flag makes grep
treat PATTERN as a set of newline-separated strings. For instance:
$ cat A.txt
&
^
[
]
$ cat B.txt
[
^
]
|
$ grep -v -x -f B.txt A.txt
grep: B.txt:1: Invalid regular expression
$ grep -F -v -x -f B.txt A.txt
&
Using diff:
diff --changed-group-format='%<' --unchanged-group-format='' A.txt B.txt