Как объединить два файла с идентификатором в цикле? - PullRequest
2 голосов
/ 29 марта 2011

У меня 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 ]

4 голосов
/ 29 марта 2011
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
2 голосов
/ 29 марта 2011
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
1 голос
/ 29 марта 2011
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
0 голосов
/ 29 марта 2011
for i in {1..100}
do
  awk '{print $0,FILENAME}' "cool${i}.txt" "warm${i}.txt" > "coolwarm${i}.txt"
done

, если вы просто хотите, чтобы в качестве идентификатора использовались «крутые» и «теплые», сделайте substring для FILENAME по желанию, например, 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 )
    }
}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...