मैं साइट और प्रोग्रामिंग की दुनिया में नया हूं और मुझे आशा है कि आपके पास मेरी मदद करने के लिए समय होगा। मेरी समस्या इस प्रकार है: मेरे पास कई कॉलम वाली एक फाइल है। दूसरे कॉलम में मान हैं। मैं किसी दिए गए नंबर पर प्रत्येक मान के योग की गणना करने और योग के परिणामों वाले दूसरे कॉलम को एक नए कॉलम से बदलने की कोशिश कर रहा हूं। मेरे इनपुट का एक उदाहरण यहां दिया गया है:

A B C
x 1 t
y 2 u
z 3 v

मैं बी कॉलम में 5 में मानों को जोड़ना चाहता हूं और नीचे दिए गए आउटपुट को प्राप्त करना चाहता हूं:

A B C
x 6 t
y 7 u
z 8 v

जिस कोड को मैंने असफल रूप से आजमाया है वह है

zcat my_file.vcf.gz| tail -n +49 | awk 'BEGIN{FS=OFS="\t"} {print $0, $2+5}'>my.output.vcf

अग्रिम में धन्यवाद

awk
3
MrGoodcat 22 अक्टूबर 2020, 12:20

6 जवाब

सबसे बढ़िया उत्तर

आप उपयोग कर सकते हैं

awk 'BEGIN{FS=OFS="\t"} {$2+=5}1'

यहां, $2+=5, फाइल किए गए 2 मान में 5 जोड़ देगा, और 1 रिकॉर्ड के प्रदर्शन को ट्रिगर करेगा (पंक्ति, रेखा, print $0 के समान)।

एक ऑनलाइन awk डेमो देखें:

#!/bin/bash
s='A    B   C
x   1   t
y   2   u
z   3   v'
awk 'BEGIN{FS=OFS="\t"} {$2+=5}1' <<< "$s"

आउटपुट:

A   5   C
x   6   t
y   7   u
z   8   v
1
Wiktor Stribiżew 22 अक्टूबर 2020, 12:26
cat boo
A       B       C
x       1       t
y       2       u
z       3       v

cat boo | awk 'BEGIN{FS=OFS="\t"} $2 ~ /^[0-9]+$/ {print $1, $2+5, $3}  $2 !~ /^[0-9]+$/ {print} '
A       B       C
x       6       t
y       7       u
z       8       v
0
confused genius 22 अक्टूबर 2020, 20:40

माउब यह आपकी मदद कर सकता है:

cat file | awk '{if (NR > 1 && $2 = ($2+5)) 
                     print $0;
                else print $0;}'

उत्तर आपके कोड पर लागू होता है:

zcat my_file.vcf.gz| tail -n +49 | awk '{if (NR > 1 && $2 = ($2+5)) print $0; else print $0;}' > my.output.vcf
0
acakojic 22 अक्टूबर 2020, 16:43

आप उपयोग कर सकते हैं:

awk 'BEGIN {FS=OFS="\t"} NR == 1 {print $0}   NR > 1 {print $1,($2+5),$3;}'

आउटपुट:

A       B       C
x       6       t
y       7       u
z       8       v
1
Fábio Almeida 22 अक्टूबर 2020, 12:49

स्पष्टता के लिए दूसरा रूप:

awk 'BEGIN{FS=OFS="\t"} {print $1, $2+5, $3}'
1
James Brown 22 अक्टूबर 2020, 12:29

हम tail का उपयोग करने से बच सकते हैं क्योंकि 49वीं पंक्ति से लाइनों की छपाई awk के भीतर ही की जा सकती है। इसके अलावा आपको दूसरे क्षेत्र में मूल्य जोड़ने की जरूरत है और फिर आप पूरी लाइन को print कमांड द्वारा ही प्रिंट कर सकते हैं।

महत्वपूर्ण बिंदु, ओपी के नमूने के अनुसार यदि दूसरे क्षेत्र में अक्षर हैं तो उसमें 5 जोड़ने की आवश्यकता नहीं है, इसलिए उस स्थिति का भी यहाँ ध्यान रखा।

zcat my_file.vcf.gz | 
awk '
  BEGIN{ FS=OFS="\t" }
  FNR>=49{
    $2=($2~/[a-zA-Z]/?$2:$2+5)
    print
  }
' > my.output.vcf
2
RavinderSingh13 22 अक्टूबर 2020, 12:37