Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash AWK:使用第一行';s信息,用于在每行前加上前缀_Bash_Awk - Fatal编程技术网

Bash AWK:使用第一行';s信息,用于在每行前加上前缀

Bash AWK:使用第一行';s信息,用于在每行前加上前缀,bash,awk,Bash,Awk,我在bash脚本中有一个awk1行程序。 需要帮助做一个awk线路。。。 这是我试过的,但不起作用 这是我的数据 . abc hji ran kls CHR1 0/0 0/0 0/1 0/0 CHR2 0/1 0/0 0/0 0/0 CHR3 1/1 0/0 0/0 0/0 CHR4 0/0 0/0 0/0 1/1 到目前为止我拥有的代码(其他bash代码与此无关): 我希望它打印以下内容: . abc hji ran kls ran CHR1 0/0 0/0 0/1 0/0 abc C

我在bash脚本中有一个awk1行程序。 需要帮助做一个awk线路。。。 这是我试过的,但不起作用

这是我的数据

. abc hji ran kls
CHR1 0/0 0/0 0/1 0/0
CHR2 0/1 0/0 0/0 0/0
CHR3 1/1 0/0 0/0 0/0
CHR4 0/0 0/0 0/0 1/1
到目前为止我拥有的代码(其他bash代码与此无关):

我希望它打印以下内容:

 . abc hji ran kls
 ran CHR1 0/0 0/0 0/1 0/0
 abc CHR2 0/1 0/0 0/0 0/0
 abc CHR3 1/1 0/0 0/0 0/0
 kls CHR4 0/0 0/0 0/0 1/1

基本上,只需在awk命令前面加上一个空格$i,但只在第一行使用$i。谢谢你的帮助

以下
tesprog.awk
脚本将为您提供所需:

NR==1 {
    for (i = 2; i <= NF; i++) {
        txt[i] = $i;
    }
    print $0;
}
NR > 1 {
    pos = 0;
    for (i = 2; i <= NF; i++) {
        if ($i != "0/0") {
            pos = i;
        }
    }
    print txt[pos]" "$0;
}
现在,如果我没有完全正确的选择标准,
if($I!=“0/0”)
,可能需要进行一些调整,但这应该是一个相当小的更改。如果有多个可能的匹配项,它还会选择最后一个匹配列。因此,如果有可能,您应该指定在这种情况下需要的行为


要在
bash
脚本中执行此操作,而不需要单独的
awk
脚本,只需使用:

awk '
    NR==1 {
        for (i = 2; i <= NF; i++) {
            txt[i] = $i;
        }
        print $0;
    }
    NR > 1 {
        pos = 0;
        for (i = 2; i <= NF; i++) {
            if ($i != "0/0") {
                pos = i;
            }
        }
        print txt[pos]" "$0;
    }' testprog.in
awk'
NR==1{
对于(i=2;i=1{
pos=0;

对于(i=2;i以下
tesprog.awk
脚本将为您提供所需:

NR==1 {
    for (i = 2; i <= NF; i++) {
        txt[i] = $i;
    }
    print $0;
}
NR > 1 {
    pos = 0;
    for (i = 2; i <= NF; i++) {
        if ($i != "0/0") {
            pos = i;
        }
    }
    print txt[pos]" "$0;
}
现在,如果我没有完全正确的选择标准,
if($I!=“0/0”)
,可能需要进行一些调整,但这应该是一个相当小的更改。如果有多个可能的匹配,它还会选择最后一个匹配列。因此,如果有可能,您应该指定在这种情况下需要的行为


要在
bash
脚本中执行此操作,而不需要单独的
awk
脚本,只需使用:

awk '
    NR==1 {
        for (i = 2; i <= NF; i++) {
            txt[i] = $i;
        }
        print $0;
    }
    NR > 1 {
        pos = 0;
        for (i = 2; i <= NF; i++) {
            if ($i != "0/0") {
                pos = i;
            }
        }
        print txt[pos]" "$0;
    }' testprog.in
awk'
NR==1{
对于(i=2;i=1{
pos=0;

对于(i=2;i,这里还有一个变化:

awk 'NR==1 {for (i=2;i<=NF;i++) a[i]=$i;print;next} {for (i=2;i<=NF;i++) if ($i~"/1") $1=a[i]FS$1}1' file
. abc hji ran kls
ran CHR1 0/0 0/0 0/1 0/0
abc CHR2 0/1 0/0 0/0 0/0
abc CHR3 1/1 0/0 0/0 0/0
kls CHR4 0/0 0/0 0/0 1/1

awk'NR==1{for(i=2;i这里是另一个变体:

awk 'NR==1 {for (i=2;i<=NF;i++) a[i]=$i;print;next} {for (i=2;i<=NF;i++) if ($i~"/1") $1=a[i]FS$1}1' file
. abc hji ran kls
ran CHR1 0/0 0/0 0/1 0/0
abc CHR2 0/1 0/0 0/0 0/0
abc CHR3 1/1 0/0 0/0 0/0
kls CHR4 0/0 0/0 0/0 1/1

awk'NR==1{for(i=2;iHi paxdiablo,感谢您的回复。我忘了提到awk 1 liner是bash脚本的一部分,使用您的方法我是否必须创建一个awk脚本并将其合并到我的bash脚本中?@adrotter,请参阅更新。我将其作为单独的脚本来做,只是因为我喜欢可读性,但它在
b中也同样可读ash
脚本,如果您真的需要一行程序,则可读性会稍差一些。您好paxdiablo,谢谢您的回复。我忘了提到awk 1行程序是bash脚本的一部分,使用您的方法,我是否必须创建一个awk脚本并将其合并到我的bash脚本中?@adrotter,请参阅更新。我是作为一个单独的脚本来做的,因为使用“我喜欢可读性”,但它可以在
bash
脚本中同样可读,如果您真的需要一行程序,则可读性稍差。
awk 'NR==1 {for (i=2;i<=NF;i++) a[i]=$i;print;next} {for (i=2;i<=NF;i++) if ($i~"/1") $1=a[i]FS$1}1' file
. abc hji ran kls
ran CHR1 0/0 0/0 0/1 0/0
abc CHR2 0/1 0/0 0/0 0/0
abc CHR3 1/1 0/0 0/0 0/0
kls CHR4 0/0 0/0 0/0 1/1
awk '
NR==1 {                     # For line "1"
    for (i=2;i<=NF;i++)     # Loop trough all elements
        a[i]=$i             # Store them in an array "a" using field location as reference
    print                   # Print the line
    next}                   # Do nothing more with line "1"
    {for (i=2;i<=NF;i++)    # Loop trough all fields of all other line
        if ($i~"/1")        # If field location contains "/1"
            $1=a[i]FS$1}    # Use that field number and get information from first line
1                           # Print all out
' file                      # Read the file