Bash AWK:使用第一行';s信息,用于在每行前加上前缀
我在bash脚本中有一个awk1行程序。 需要帮助做一个awk线路。。。 这是我试过的,但不起作用 这是我的数据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
. 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