Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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 根据列将数据分组到类别中_Bash_Text_Awk - Fatal编程技术网

Bash 根据列将数据分组到类别中

Bash 根据列将数据分组到类别中,bash,text,awk,Bash,Text,Awk,我有一个以制表符分隔的文件,它有两列,如下所示: new.txt 1.01 yes 2.00 no 0.93 no 1.2223 yes 1.7211 no 我想修改它的内容,就好像有两个类别: new_categorized.txt yes no 1.01 2.00 1.2223 0.93 1.7211 我在R()中发现了一个类似的问题,但我需要用bash或awk来回答。。 非常感谢您的帮助。使用bash、GNU

我有一个以制表符分隔的文件,它有两列,如下所示:

new.txt
    1.01   yes
    2.00   no
    0.93   no
    1.2223 yes
    1.7211 no
我想修改它的内容,就好像有两个类别:

new_categorized.txt
yes    no
1.01   2.00
1.2223 0.93
       1.7211
我在R()中发现了一个类似的问题,但我需要用bash或awk来回答。。
非常感谢您的帮助。

使用bash、GNU grep和paste:

echo -e "yes\tno"
paste <(grep -Po '^\t\K.*(?=\tyes)' new.txt) <(grep -Po '^\t\K.*(?=\tno)' new.txt)
echo-e“是\t否”

使用bash、GNU grep和paste粘贴:

echo -e "yes\tno"
paste <(grep -Po '^\t\K.*(?=\tyes)' new.txt) <(grep -Po '^\t\K.*(?=\tno)' new.txt)
echo-e“是\t否”
粘贴
$cat tst.awk
开始{FS=OFS=“\t”}
!(2美元,标签号2){
label2colNr[$2]=++numCols
colNr2label[numCols]=2美元
}
{
colNr=label2colNr[$2]
val[++numRows[colNr],colNr]=1美元
maxRows=(numRows[colNr]>maxRows?numRows[colNr]:maxRows)
}
结束{
对于(colNr=1;colNr
$cat tst.awk
开始{FS=OFS=“\t”}
!($2标签颜色){
label2colNr[$2]=++numCols
colNr2label[numCols]=2美元
}
{
colNr=label2colNr[$2]
val[++numRows[colNr],colNr]=1美元
maxRows=(numRows[colNr]>maxRows?numRows[colNr]:maxRows)
}
结束{

对于(colNr=1;colNrGNU
awk
解决方案:

awk '{ a[$2][($2=="yes"? ++y : ++n)]=$1 }
     END{ 
         max=(y > n? y:n); 
         print "yes","no";
         for(i=1; i<=max; i++) print a["yes"][i], a["no"][i] 
     }' OFS='\t' file | column -tn

GNU
awk
解决方案:

awk '{ a[$2][($2=="yes"? ++y : ++n)]=$1 }
     END{ 
         max=(y > n? y:n); 
         print "yes","no";
         for(i=1; i<=max; i++) print a["yes"][i], a["no"][i] 
     }' OFS='\t' file | column -tn

谢谢您的回答。在这里,您是如何将输出定向到另一个文件的?
{echo…;paste…;}>file.txt
.Last
很重要。谢谢您的回答。在这里,您是如何将输出定向到另一个文件的?
{echo…;paste…;}>file.txt
。Last
很重要。谢谢。我试过了,但它给了我确切的new.txt而不是categories.。那根本不可能。你一定是复制/粘贴错了。对不起。你是对的,我错了。你的答案是works@EdMorton:我在那里回收了你的代码:@Cyrus很高兴听到。这应该是一个常见问题解答:-)。谢谢。我试过了,但它给了我确切的new.txt而不是categories.。那根本不可能。你一定是复制/粘贴错了。对不起。你是对的,我有一个拼写错误。你的答案是works@EdMorton:我在那里回收了你的代码:@Cyrus很高兴听到。这应该是一个常见问题解答:-)。谢谢,但它抱怨为:awk:line 1:语法错误在或附近[awk:line 5:语法错误在或附近[@bapos,1)检查您的awk版本;2)检查您的代码是否有错误。这是一个屏幕截图,谢谢,但它抱怨为:awk:line 1:语法错误在或附近[awk:line 5:语法错误在或附近[@bapos,1)检查您的awk版本;2)检查您的代码是否有错误。这是一个屏幕截图
yes     no
1.01    2.00
1.2223  0.93
        1.7211