<html><head></head><body><div class="ydp9d5363b6yahoo-style-wrap" style="font-family:Helvetica Neue, Helvetica, Arial, sans-serif;font-size:16px;"><div></div>
        <div dir="ltr" data-setdir="false">Hi Micha,</div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false">thanks for the suggestion, it solves my question on how to perform this middle step of listing the columns that do not match the intended ones. </div><div dir="ltr" data-setdir="false">I'll use it for now! =)</div><div><br></div><div dir="ltr" data-setdir="false">Best</div><div dir="ltr" data-setdir="false">B</div>
        
        </div><div id="yahoo_quoted_5164484779" class="yahoo_quoted">
            <div style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:13px;color:#26282a;">
                
                <div>
                    Em quinta-feira, 10 de fevereiro de 2022 09:45:29 GMT+1, Micha Silver <tsvibar@gmail.com> escreveu:
                </div>
                <div><br></div>
                <div><br></div>
                <div><div dir="ltr"><br clear="none">On 09/02/2022 15:56, Bernardo Santos via grass-user wrote:<br clear="none">> Dear Markus<br clear="none">><br clear="none">> Thanks for your answer. I thought about v.db.dropcolumn earlier. <br clear="none">> However, I am trying to include this within a function, following a <br clear="none">> workflow in which the input vector might have columns with different <br clear="none">> names, in which case it would be good to be able to select the ones to <br clear="none">> keep instead of the ones to remove.<br clear="none">> For instance, let's say I want to be able to provide either of the <br clear="none">> following input vectors:<br clear="none">> - "vector1", with columns "a, b, c, d, e"<br clear="none">> - "vector2", with columns "j, a, k, f, e"<br clear="none">> Let's say I want to keep only "a" and "e".<br clear="none">><br clear="none">> If I use v.db.dropcolumn, I'll have to first list the names of all <br clear="none">> columns (maybe with v.db.select), then match all the column names that <br clear="none">> I do not want to keep ("b, c, d" in the first case, "j, k, f" in the <br clear="none">> second), then drop them with v.db.dropcolumn. I thought just selecting <br clear="none">> which ones I want to keep would be simpler and more straightforward, <br clear="none">> if there is a tool for that.<br clear="none">><br clear="none">> So far I am doing a long step (I am creating a temporary vector to <br clear="none">> avoid changing the input):<br clear="none">> 1) v.extract -t input=vector1 output=temp_vector (here I select only <br clear="none">> the features, not attribute table)<br clear="none">> 2) v.db.addtable map=temp_vector columns=a,e (here I do not bother <br clear="none">> with the names of the undesirable columns)<br clear="none">> 3) v.db.update map=temp_vector column=e value=1 (here I set a value <br clear="none">> but I could take it from the original vector1)<br clear="none">><br clear="none">> Following what you suggest, I could do:<br clear="none">> 1) g.copy vector=vector1,temp_vector<br clear="none">> 2) (find out a way to list the undesirable column names)<br clear="none"><br clear="none"><br clear="none">Here's a possible solution. (Somewhat clunky, but workable)<br clear="none"><br clear="none">You can get the column names using v.info -c, then grep out the column <br clear="none">names you want to keep. Then loop thru the column names that are left <br clear="none">and do v.db.dropcolumn for each.<br clear="none"><br clear="none"><br clear="none">i.e.:<br clear="none"><br clear="none"># I have a vector "terraces" with 4 columns.<br clear="none"><br clear="none">v.info -c terraces<br clear="none">Displaying column types/names for database connection of layer <1>:<br clear="none">INTEGER|cat<br clear="none">INTEGER|OBJECTID<br clear="none">DOUBLE PRECISION|Shape_Leng<br clear="none">INTEGER|Validated<br clear="none"><br clear="none"><br clear="none">#Keep only 2: "cat" and "Validated"<br clear="none"><br clear="none">g.copy vect=terraces,terraces_tmp<br clear="none">Copying vector <<a shape="rect" ymailto="mailto:terraces@Avdat" href="mailto:terraces@Avdat">terraces@Avdat</a>> to current mapset as <terraces_tmp><br clear="none"><br clear="none"><br clear="none"># Get a list of columns to drop<br clear="none"><br clear="none">to_drop=`v.info -c terraces_tmp | cut -d'|' -f2 | grep -E -v 'Validate|cat'`<br clear="none">Displaying column types/names for database connection of layer <1>:<br clear="none"><br clear="none"><br clear="none">echo $to_drop<br clear="none">OBJECTID Shape_Leng<br clear="none"><br clear="none"><br clear="none"># Loop thru columns to drop and run v.db.dropcolumn on each<br clear="none"><br clear="none">for col in $to_drop; do v.db.dropcolumn terraces_tmp col=${col}; done<br clear="none"><br clear="none"><br clear="none"># Result<br clear="none"><br clear="none">v.info -c terraces_tmp<br clear="none">Displaying column types/names for database connection of layer <1>:<br clear="none">INTEGER|cat<br clear="none">INTEGER|Validated<br clear="none"><br clear="none"><br clear="none">HTH,<br clear="none"><br clear="none">Micha<br clear="none"><br clear="none"><br clear="none">> 3) v.db.dropcolumn columns=list_undesidable_columns<br clear="none">><br clear="none">> Neither of the solutions is so straightforward, that's why I thought <br clear="none">> there should be (or could be) another way.<br clear="none">> In R, for instance, I can easily subset columns of an sf object using <br clear="none">> dplyr::select(vector1, a, e). I guess in PostGIS it is also possible <br clear="none">> to do that with "SELECT statements", even though I am less skilled <br clear="none">> there. It would be great to have a module in GRASS to do it as well...<br clear="none">><br clear="none">> Best<br clear="none">> Bernardo<br clear="none">> Em quarta-feira, 9 de fevereiro de 2022 09:28:06 GMT+1, Markus Neteler <br clear="none">> <<a shape="rect" ymailto="mailto:neteler@osgeo.org" href="mailto:neteler@osgeo.org">neteler@osgeo.org</a>> escreveu:<br clear="none">><br clear="none">><br clear="none">> Hi Bernardo,<br clear="none">><br clear="none">> On Wed, Feb 9, 2022 at 1:39 AM Bernardo Santos via grass-user<br clear="none">> <<a shape="rect" ymailto="mailto:grass-user@lists.osgeo.org" href="mailto:grass-user@lists.osgeo.org">grass-user@lists.osgeo.org</a>> wrote:<br clear="none">> ><br clear="none">> > Dear list,<br clear="none">> ><br clear="none">> > Is there a GRASS GIS command (maybe a v.db.* one) to subset, in a <br clear="none">> single command, the columns of a vector?<br clear="none">> ><br clear="none">> > What I have: vector "vect" with 5 columns "a, b, c, d, e" in the <br clear="none">> attribute table<br clear="none">> > What I want: vector "vect_sub" with only, for instance, "a, c, e"<br clear="none">> ><br clear="none">> > I can use v.extract to subsample rows, but not columns. What is the <br clear="none">> easiest way of doing that, what needing many commands (like creating <br clear="none">> or copying the vector to a new one, creating a new attribute table, <br clear="none">> then copying only the columns I want).<br clear="none">><br clear="none">> Isn't this simply<br clear="none">><br clear="none">> <a shape="rect" href="https://grass.osgeo.org/grass80/manuals/vector.html" target="_blank">https://grass.osgeo.org/grass80/manuals/vector.html</a><br clear="none">> --> v.db.dropcolumn - Drops a column from the attribute table<br clear="none">> connected to a given vector map.<br clear="none">>     --> It offers single and multiple column dropping: <br clear="none">> columns=name[,name,...]<br clear="none">><br clear="none">><br clear="none">> > I looked for that in the documentation but did not found it so easily.<br clear="none">><br clear="none">><br clear="none">> Please suggest where to improve the documentation.<br clear="none">><br clear="none">> Markus<br clear="none">><br clear="none">><br clear="none">> _______________________________________________<br clear="none">> grass-user mailing list<div class="yqt6621329006" id="yqtfd61582"><br clear="none">> <a shape="rect" ymailto="mailto:grass-user@lists.osgeo.org" href="mailto:grass-user@lists.osgeo.org">grass-user@lists.osgeo.org</a></div><br clear="none">> <a shape="rect" href="https://lists.osgeo.org/mailman/listinfo/grass-user" target="_blank">https://lists.osgeo.org/mailman/listinfo/grass-user</a><br clear="none"><br clear="none">-- <br clear="none">Micha Silver<br clear="none">Ben Gurion Univ.<br clear="none">Sde Boker, Remote Sensing Lab<br clear="none">cell: +972-523-665918<div class="yqt6621329006" id="yqtfd38201"><br clear="none"><br clear="none"></div></div></div>
            </div>
        </div></body></html>