使用bash进行文件和文本处理

时间:2012-06-14 05:17:25

标签: bash shell sed awk

我有两个文本文件。 hash_only.txt和final_output.txt hash_only.txt如下所示。

193548
401125
401275

final_output.txt如下所示。

193548      1199687744  5698758206701808640
193548      1216464960  5698758206761818112
193548      1216464960  5698758206778417152
193548      4236691520  5698758206778945280
401125      2138607488  5698762375908890880
401125       863932288  5698762375909423360
401125      3884158848  5698762375910044160
401125      2609483648  5698762375911032320

我正在尝试编写一个执行以下操作的循环。

for i in `cat hash_only.txt` ;
do
    for j in `cat final_output.txt` ;
            do
                    if [ $i -eq $j ]
                    then
                            echo $i $j      
                    fi
            done
 done;

对于hash_only.txt中的所有值,例如193548,401125等,我想从文件'final_output.txt'中提取第2,3列,其中第1列与193548,401125等匹配并输出 第2,3栏至print_193548,print_401125等。

我如何做到这一点。在上面的代码中,我需要将一些代码放在那个部分中。但是我无法弄明白,因为我对bash不是很精通。

编辑:

我现在已经修改了我的脚本,看起来像cat hash_only.txt;

do
        for j in `cat final_output.txt` ;
                do
                        if [ $i -eq $j ]
                        then
                                gawk 'FNR==NR
                                        { hash[$1]  
                                          next 
                                        }
                                       $1 in hash  { 
                                        print $2,$3 >> "print_"$1; 
                                }' hash_only.txt final_output.txt
                        fi
                done
done;

它没有创建任何名为print_ [0-9] *的文件。我不明白为什么不呢?

3 个答案:

答案 0 :(得分:2)

试试这个:

nawk 'FNR==NR{a[$0];next}($1 in a){print $2,$3>$1}' hash_only.txt  final_output.txt 

这实际上会创建一个名称为第一个字段的文件,并以您请求的方式存储输出。

答案 1 :(得分:1)

awk '
FNR==NR {
    hash[$1]
    next
}
$1 in hash {
    printf("%s\t%s\n", $2, $3) > "print_"$1;
}' hash_only.txt final_output.txt

多么神奇,我的解决方案几乎与彼得相同。

答案 2 :(得分:-1)

cat hash_only.txt | while read FNAME; do { cat final_output.txt |grep ${FNAME} |awk '{$1="";}1' > print_${FNAME}; } ; done ; find ./print_* -type f -size 0 -delete
$ ls ./print_??????
./print_193548  ./print_401125
$ cat ./print_193548
 1199687744 5698758206701808640
 1216464960 5698758206761818112
 1216464960 5698758206778417152
 4236691520 5698758206778945280
$ cat ./print_401125
 2138607488 5698762375908890880
 863932288 5698762375909423360
 3884158848 5698762375910044160
 2609483648 5698762375911032320