如何拆分列内的值并创建两个不同的 table?
how to split values inside column and create two differents table?
我想这很容易,但我不知道如何正确地制作它,
我有这种 table :
samplexxx EH Tred GangSTR
dijen006_100 17 17 10,17
dijen006_75 . . .
dijen017_100 17,21 17,21 12,17
dijen017_75 17 21 20,20
dijen081_100 17,20 17,20 10,19
dijen081_75 17 17 18,18
dijen082_100 21,22 21,22 14,22
dijen082_75 22 22,27 21,21
dijen083_100 20 20 10,20
dijen083_75 20 20 19,19
dijen1013_100 17,20 17,20 9,19
dijen1013_75 18,20 17,20 17,19
dijen1014_100 17,18 17,18 8,17
dijen1014_75 18 18 18,18
dijen1015_100 nofile . 7,15
dijen1015_75 16 16 15,16
dijen402_100 21,31 21,29 9,27
dijen402_75 27,31 21,38 18,36
我想创建两个新的 table,第一个值在逗号前,第二个 table 有第二个值(如果存在)。
我尝试使用 awk :
less HTT.tsv | awk -F ',' '{print }'
samplexxx EH Tred GangSTR
dijen006_100 17 17 10
dijen006_75 . . .
dijen017_100 17
dijen017_75 17 21 20
dijen081_100 17
dijen081_75 17 17 18
dijen082_100 21
dijen082_75 22 22
dijen083_100 20 20 10
dijen083_75 20 20 19
dijen1013_100 17
dijen1013_75 18
dijen1014_100 17
dijen1014_75 18 18 18
dijen1015_100 nofile . 7
dijen1015_75 16 16 15
dijen402_100 21
dijen402_75 27
但显然它不正确,因为某些行缺少值,有人知道吗?谢谢!
假设您希望每个输入行都在两个输出文件中表示:
$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR == 1 {
str1 = str2 = [=10=]
}
NR > 1 {
str1 = str2 =
for (i=2; i<=NF; i++) {
split($i,a,/,/)
str1 = str1 OFS a[1]
str2 = str2 OFS a[2]
}
}
{
print str1 > "foo"
print str2 > "bar"
}
$ awk -f tst.awk file
$ head -50 foo bar
==> foo <==
samplexxx EH Tred GangSTR
dijen006_100 17 17 10
dijen006_75 . . .
dijen017_100 17 17 12
dijen017_75 17 21 20
dijen081_100 17 17 10
dijen081_75 17 17 18
dijen082_100 21 21 14
dijen082_75 22 22 21
dijen083_100 20 20 10
dijen083_75 20 20 19
dijen1013_100 17 17 9
dijen1013_75 18 17 17
dijen1014_100 17 17 8
dijen1014_75 18 18 18
dijen1015_100 nofile . 7
dijen1015_75 16 16 15
dijen402_100 21 21 9
dijen402_75 27 21 18
==> bar <==
samplexxx EH Tred GangSTR
dijen006_100 17
dijen006_75
dijen017_100 21 21 17
dijen017_75 20
dijen081_100 20 20 19
dijen081_75 18
dijen082_100 22 22 22
dijen082_75 27 21
dijen083_100 20
dijen083_75 19
dijen1013_100 20 20 19
dijen1013_75 20 20 19
dijen1014_100 18 18 17
dijen1014_75 18
dijen1015_100 15
dijen1015_75 16
dijen402_100 31 29 27
dijen402_75 31 38 36
我想这很容易,但我不知道如何正确地制作它, 我有这种 table :
samplexxx EH Tred GangSTR
dijen006_100 17 17 10,17
dijen006_75 . . .
dijen017_100 17,21 17,21 12,17
dijen017_75 17 21 20,20
dijen081_100 17,20 17,20 10,19
dijen081_75 17 17 18,18
dijen082_100 21,22 21,22 14,22
dijen082_75 22 22,27 21,21
dijen083_100 20 20 10,20
dijen083_75 20 20 19,19
dijen1013_100 17,20 17,20 9,19
dijen1013_75 18,20 17,20 17,19
dijen1014_100 17,18 17,18 8,17
dijen1014_75 18 18 18,18
dijen1015_100 nofile . 7,15
dijen1015_75 16 16 15,16
dijen402_100 21,31 21,29 9,27
dijen402_75 27,31 21,38 18,36
我想创建两个新的 table,第一个值在逗号前,第二个 table 有第二个值(如果存在)。 我尝试使用 awk :
less HTT.tsv | awk -F ',' '{print }'
samplexxx EH Tred GangSTR
dijen006_100 17 17 10
dijen006_75 . . .
dijen017_100 17
dijen017_75 17 21 20
dijen081_100 17
dijen081_75 17 17 18
dijen082_100 21
dijen082_75 22 22
dijen083_100 20 20 10
dijen083_75 20 20 19
dijen1013_100 17
dijen1013_75 18
dijen1014_100 17
dijen1014_75 18 18 18
dijen1015_100 nofile . 7
dijen1015_75 16 16 15
dijen402_100 21
dijen402_75 27
但显然它不正确,因为某些行缺少值,有人知道吗?谢谢!
假设您希望每个输入行都在两个输出文件中表示:
$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR == 1 {
str1 = str2 = [=10=]
}
NR > 1 {
str1 = str2 =
for (i=2; i<=NF; i++) {
split($i,a,/,/)
str1 = str1 OFS a[1]
str2 = str2 OFS a[2]
}
}
{
print str1 > "foo"
print str2 > "bar"
}
$ awk -f tst.awk file
$ head -50 foo bar
==> foo <==
samplexxx EH Tred GangSTR
dijen006_100 17 17 10
dijen006_75 . . .
dijen017_100 17 17 12
dijen017_75 17 21 20
dijen081_100 17 17 10
dijen081_75 17 17 18
dijen082_100 21 21 14
dijen082_75 22 22 21
dijen083_100 20 20 10
dijen083_75 20 20 19
dijen1013_100 17 17 9
dijen1013_75 18 17 17
dijen1014_100 17 17 8
dijen1014_75 18 18 18
dijen1015_100 nofile . 7
dijen1015_75 16 16 15
dijen402_100 21 21 9
dijen402_75 27 21 18
==> bar <==
samplexxx EH Tred GangSTR
dijen006_100 17
dijen006_75
dijen017_100 21 21 17
dijen017_75 20
dijen081_100 20 20 19
dijen081_75 18
dijen082_100 22 22 22
dijen082_75 27 21
dijen083_100 20
dijen083_75 19
dijen1013_100 20 20 19
dijen1013_75 20 20 19
dijen1014_100 18 18 17
dijen1014_75 18
dijen1015_100 15
dijen1015_75 16
dijen402_100 31 29 27
dijen402_75 31 38 36