我正在嘗試使用 awk 使用包含使用另一個 awk 腳本創建的陣列的條件陳述句來提取資料。
我用于創建陣列的 awk 腳本如下:
array=($(awk 'NR>1 { print $1 }' < file.tsv))
然后,在另一個 awk 腳本中使用這個陣列
awk var="${array[@]}" 'FNR==1{ for(i=1;i<=NF;i ){ heading[i]=$i } next } { for(i=2;i<=NF;i ){ if($i=="1" && heading[i] in var){ close(outFile); outFile=heading[i]".txt"; print ">kmer"NR-1"\n"$1 >> (outFile) }}}' < input.txt
但是,當我運行它時,會發生以下錯誤。
awk: fatal: cannot open file 'foo' for reading (No such file or directory)
我已經查看了多篇關于為什么會發生此錯誤以及如何在 awk 中正確實作 shell 變數的帖子,但到目前為止,這些都沒有奏效。但是,當洗掉 shell 變數并運行腳本時,它確實可以作業。
awk 'FNR==1{ for(i=1;i<=NF;i ){ heading[i]=$i } next } { for(i=2;i<=NF;i ){ if($i=="1"){ close(outFile); outFile=heading[i]".txt"; print ">kmer"NR-1"\n"$1 >> (outFile) }}}' < input.txt
我真的需要那個條件陳述句,但不知道我在 awk 中實作 bash 變數時做錯了什么,希望能得到一些幫助。
提前謝謝。
uj5u.com熱心網友回復:
您可以將字串存盤在變數中,然后使用split函式將其轉換為陣列,考慮以下簡單示例,讓file1.txt內容為
A B C
D E F
G H I
和file2.txt內容是
1
3
2
然后
var1=$(awk '{print $1}' file1.txt)
awk -v var1="$var1" 'BEGIN{split(var1,arr)}{print "First column value in line number",$1,"is",arr[$1]}' file2.txt
給出輸出
First column value in line number 1 is A
First column value in line number 3 is G
First column value in line number 2 is D
說明:我存盤第一個awk命令的輸出,然后將其用作第一個引數以split在第二個awk命令中起作用。免責宣告:此解決方案假定所有涉及的檔案都具有符合默認 GNUAWK行為的分隔符,即一個或多個空格始終是分隔符。
(在 gawk 4.2.1 中測驗)
uj5u.com熱心網友回復:
該特定錯誤訊息是因為您忘記-v了var=(應該是awk -v var=,而不僅僅是awk var=),但正如其他人指出的那樣,您不能在 awk 命令列上設定陣列變數。另請注意,array您的代碼中是一個shell陣列,而不是awk陣列,并且 shell 和 awk 是兩個完全不同的工具,每個工具都有自己的語法、語意、范圍等。
以下是如何真正做你想做的事情:
array=( "$(awk 'BEGIN{FS=OFS="\t"} NR>1 { print $1 }' < file.tsv)" )
awk -v xyz="${array[*]}" '
BEGIN{ split(xyz,tmp,RS); for (i in tmp) var[tmp[i]] }
... now use `var` as you were trying to ...
'
例如:
$ cat file.tsv
col1 col2
a b c d e
f g h i j
$ cat -T file.tsv
col1^Icol2
a b^Ic d e
f g h^Ii j
$ awk 'BEGIN{FS=OFS="\t"} NR>1 { print $1 }' < file.tsv
a b
f g h
$ array=( "$(awk 'BEGIN{FS=OFS="\t"} NR>1 { print $1 }' < file.tsv)" )
$ awk -v xyz="${array[*]}" '
BEGIN {
split(xyz,tmp,RS)
for (i in tmp) {
var[tmp[i]]
}
for (idx in var) {
print "<" idx ">"
}
}
'
<f g h>
<a b>
uj5u.com熱心網友回復:
只需讀取兩個檔案awk
awk '
FNR == NR {
if ( FNR > 1 )
var[$1]
next
}
FNR == 1 {
for (i = 1; i <= NF; i )
heading[i] = $i
next
}
{
for (i = 2; i <= NF; i )
if ( $i == "1" && heading[i] in var) {
outFile = heading[i] ".txt"
print ">kmer" (NR-1) "\n" $1 >> (outFile)
close(outFile)
}
}
' file.tsv input.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/515318.html
標籤:重击壳awk
