从 2 个文件中取出第一列并将其写入第三个文件

从 2 个文件中取出第一列并将其写入第三个文件

假设我有2个文件,ABC.txt&PQR.txt以如下所示的数据为例:

ABC.txt:

ABC DEF

PQR.txt:

PQR XYZ

我想将grep两个文件的第 1 列写入第三个文本文件。如何做呢?

我的预期输出是(output.txt):

ABC PQR

答案1

这里有几种方法:

  • 使用pastecut

    $ 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

相关内容