假设我有2个文件,ABC.txt
&PQR.txt
以如下所示的数据为例:
ABC.txt:
ABC DEF
PQR.txt:
PQR XYZ
我想将grep
两个文件的第 1 列写入第三个文本文件。如何做呢?
我的预期输出是(output.txt):
ABC PQR
答案1
这里有几种方法:
使用
paste
和cut
:$ paste -d ' ' <(cut -d' ' -f 1 ABC.txt ) <(cut -d' ' -f 1 PQR.txt ) > output.txt ABC PQR
如果您的系统不支持进程替换,请使用以下命令:
$ cut -d' ' -f 1 ABC.txt > /tmp/aa; cut -d' ' -f 1 PQR.txt > /tmp/bb; paste -d ' ' /tmp/aa /tmp/bb
使用
awk
(感谢@Costas):awk 'FNR==NR{a[FNR]=$1; next}{print a[FNR],$1}' ABC.txt PQR.txt > output.txt
特殊变量
FNR
是当前输入文件的行号,并且NR
是一般输入的行号,无论它来自什么文件。仅当读取第一个输入文件时,两者才相等。因此,第一个文件的第一个字段保存在数组a
(a[FNR]=$1
) 中,其键是行号,其值是第一个字段。然后,当到达第二个文件时,我们打印与其行号 (a[NR]
) 和当前行的第一个字段对应的值。
答案2
您可以通过nl
并使用来计算行数join
join -o 1.2,2.2 <(nl ABC.txt) <(nl PQR.txt) > OUT.file
或者通过cat -n
join -o 1.2,2.2 <(cat -n ABC.txt) <(cat -n PQR.txt) > OUT.file
喜欢解析 for/while 循环中输入的两个文件你可以只使用bash builtins
while read -u 3 a b && read -u 4 c d
do
echo "$a $c"
done 3< ABC.txt 4< PQR.txt >OUT.txt
答案3
假设输入文件中的字段由一个空格分隔,我会写:
paste -d " " ABC.txt PQR.txt | cut -d " " -f 1,3 > Output.txt
处理任意空格,以及每个文件超过 2 列,并假设您的 shell 是 bash/ksh/zsh(?)
paste -d " " <(awk '{print $1}' ABC.txt) <(awk '{print $1}' PQR.txt) > Output.txt