如何在循环中将两个文件与标识符连接?

时间:2011-03-29 10:47:48

标签: linux bash shell unix awk

我有200个文件:cool1.txt,cool2.txt,..., cool100.txt and warm1.txt, warm2.txt,...,warm100.txt.

所有文件都有2列数据。

我想连接200个文件,如下coolwarm1.txt ,coolwarm2.txt,coolwarm100.txt

cat cool1.txt warm1.txt > coolwarm1.txt
cat cool2.txt warm2.txt > coolwarm2.txt
...
cat cool100.txt warm100.txt > coolwarm100.txt

在coolwarm * .txt的每个文件中,我喜欢在连接后添加标识符“cool”和“warm”。

例如,coolwarm1.txt看起来像这样

Input 
    cool1.txt 

    S44298 33307
    S46800 32286
    S55145 29361

    warm1.txt
    S10253 27473
    S24395 33093

Desired output for coolwarm1.txt

S44298 33307 cool
S46800 32286 cool
S55145 29361 cool
S10253 27473 warm
S24395 33093 warm

awk '{print FILENAME, $0}' cool1.txt warm1.txt > coolwarm1.txt会给      接近我想要的,但我无法进一步管理。

非常感谢你的帮助。

4 个答案:

答案 0 :(得分:4)

for n in `seq 1 100`; do cat cool$n.txt | awk '{print $0 " cool"}' > coolwarm$n.txt; cat warm$n.txt | awk '{print $0 " warm"}' >> coolwarm$n.txt; done

答案 1 :(得分:2)

for i in 1 2  ; do cat cool${i}.txt | awk ' { print $1,$2,"cool" } ; ' ; cat warm${i}.txt | awk ' { print $1,$2,"warm" } ' ; done
S44298 33307 cool
S46800 32286 cool
S55145 29361 cool
S10253 27473 warm
S24395 33093 warm
S44298 33307 cool
S46800 32286 cool
S55145 29361 cool
S10253 27473 warm
S24395 33093 warm

答案 2 :(得分:1)

for n in `seq 1..100`
do
sed 's/(.*)/\1 cool/' cool$n.txt >coolwarm$n.txt
sed 's/(.*)/\1 warm/' warm$n.txt >>coolwarm$n.txt
done

答案 3 :(得分:0)

for i in {1..100}
do
  awk '{print $0,FILENAME}' "cool${i}.txt" "warm${i}.txt" > "coolwarm${i}.txt"
done

如果您只想将“酷”和“暖”作为标识符,请根据需要在substringFILENAME执行操作 例如substr(FILENAME,1,4)

或者您可以冒险并在一个awk脚本中执行此操作

#!/bin/bash

awk  'BEGIN{
    for( i=1 ; i <=100 ; i++ ){
       coolname= "cool"i".txt"
       warmname= "warm"i".txt"
       output = "coolwarm"i".txt"
       while( ( getline line < coolname ) >0 ) {
          print line" cool" >>  output
       }
       close( coolname )
       while ( ( getline line < warmname ) > 0  )  {
            print line" warm" >>  output
       }
       close( warmname )
    }
}'