Insert Tabs / Indent text


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Insert Tabs / Indent text
# 1  
Old 02-18-2009
Insert Tabs / Indent text

Hi,

i need replace the slash (/) with a newline (\n) and a tab (\t).

With 'find -type f' in a folder i got this output:
./1999/01/file1
./1999/01/file2
./1999/02/file1
./2000/04/file1
./2000/04/file2
./2000/04/file3
./2000/04/file4
./2000/06/file1
./2000/06/file2
./2000/06/file3
./2000/06/file4


This is the result what i want to get:
Code:
1999
     01
         file1
         file2
     02 
         file1
2000
     04 
         file1
         file2
         file3
         file4
     06
        file1
        file2
        file3
        file4

I try it with this one liner:
Code:
find -type f | tr '\/' '\n' | awk '!x[$0]++'

* find gives me the output
* tr removes the slashes with newline
* awk removes double entries

With this line a got a result like this:
.
1999
01
file1
file2
file3

This is close to that what i want, but i dont know how i indent the code now.

I found this Tree Homepage which looks nice, but dont meet my needs, because i must add various values to each entry.

Could somebody gives me a hint?

Thanks in advance.

Stefano
# 2  
Old 02-18-2009
a slightly different output format, but....
tree.awk:
Code:
#! /usr/bin/awk -f

# tree.10
# print nice tree from find(1) output and alike
# Example:
#       find dir | tree.awk

BEGIN{
        FS = "/";
        i = 0;
        while ( i++ <= ARGC )
        {
                if ( ARGV[i] ~ /(-h)|(-\?)/ )
                {
                        print "Usage: tree.awk [FS=field-separator] [file ...]"
                        EXIT=1;
                        exit 1;
                }
        }
}

function fineprint(branches)
{
        gsub(" ","    ", branches);
        gsub("[|]","& ", branches);
        gsub("`","&---", branches);
        gsub("[+]","&---", branches);
        return branches;
}

function mktree(number,branches,   tnumber)
{

        if (number > NR)
        {
                return number - 1;
        }

        tnumber = number;

        while (array["shift", number] < array["shift", tnumber + 1])
        {
                tnumber = mktree(tnumber + 1, branches" ");
                if (tnumber == NR) break;
        }

        if (array["shift", number] == array["shift", tnumber + 1])
        {
                array["slip", number] = branches"+";
        }

        if ((array["shift", number] > array["shift", tnumber + 1]) \
                || tnumber == NR)
        {
                array["slip", number] = branches"`";
        }


        return tnumber;
}

{
        array["shift", NR] = NF;
        array["name", NR] = $(NF);
}

END{
        if (EXIT)
                exit EXIT;

        for (i = 1; i <= NR; i++)
        {
                i = mktree(i, "");
        }

        for (i = 1; i <= NR; i++)
        {

                if (i > 1)
                {
                        lprev = length(array["slip", i - 1]);
                        lcurr = length(array["slip", i]);
                        if (lprev > lcurr - 1)
                                legacy = substr(array["slip", i - 1], 0, \
                                                lcurr - 1);
                        else
                                legacy = array["slip", i-1];
                        tail = substr(array["slip", i], length(legacy) + 1 , \
                                        lcurr - length(legacy));
                        gsub("[+]", "|", legacy);
                        gsub("`", " ", legacy);
                        array["slip", i] = (legacy)(tail);
                }

                printf "%s%s\n", fineprint(array["slip", i]), \
                                array["name", i];

        }
}

# 3  
Old 02-18-2009
Another approach:

Code:
find -type f |
awk -F"/" '
a[$2] && $3==a[$2] {print "\t\t" $4}
a[$2] && $3!=a[$2] {a[$2]=$3;print "\t" $3;print "\t\t" $4}
!a[$2]{a[$2]=$3;print $2;print "\t" $3;print "\t\t" $4} '

Use nawk or /usr/xpg4/bin/awk on Solaris.

Regards
# 4  
Old 02-18-2009
yeah, but I'd assume the OP would want a non-static 'depth'....
# 5  
Old 02-18-2009
MySQL [Solved] Insert Tabs / Indent text

Thanks to you. I decide me for the second version because its short and works for me.

@vgersh99: This folderstructure has a static depth of three levels
Code:
year
  month
    file

Could you explain what awk does, Franklin52?

Stefano
# 6  
Old 02-18-2009
Quote:
Originally Posted by Tonda
Could you explain what awk does, Franklin52?

Stefano
Sure, here we go:

Code:
find -type f |
awk -F"/" '
a[$2] && $3==a[$2] {print "\t\t" $4}
a[$2] && $3!=a[$2] {a[$2]=$3;print "\t" $3;print "\t\t" $4}
!a[$2]{a[$2]=$3;print $2;print "\t" $3;print "\t\t" $4} '

Code:
awk -F"/" '

Change the fieldseparator to a slash

Code:
a[$2] && $3==a[$2] {print "\t\t" $4}

If the element a[$2] of the array exists (not a new year) and the 3th field (number) is equal to the value of the element of the array (not a new number) print 2 tabs before the 4th field (filename)

Code:
a[$2] && $3!=a[$2] {a[$2]=$3;print "\t" $3;print "\t\t" $4}

If the element a[$2] of the array exists (not a new year) and the 3th field (number) is not equal to the value of the element of the array (we have a new number!), assign the value of the 3th field (number) to the element a[$2], print 1 one tab before the 3th field (number) and 2 tabs before the 4th field (filename) on separate lines

Code:
!a[$2]{a[$2]=$3;print $2;print "\t" $3;print "\t\t" $4} '

If the array a[$2] doesn't exist (we have a new year!) assign the value of the 3th field (number) to the element a[$2], print the 2nd field (year), one tab before the 3th field (number) and 2 tabs before the 4th field (filename) on separate lines


Regards
# 7  
Old 02-19-2009
What is in the arrays?

Ah, thanks Franklin52.

i read a introduction to awk and think i got the most of this code, but i have few question to the arrays.
From where come from, are they filled automaticly like $0 with the whole line? What is in there?

Stefano
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to insert text within a file?

Hi, I am trying to check for missing dates in a file and would want to insert the missing date into the file. Currently the script is as below #!/bin/ksh dates="dates" cat ${dates} | grep -v "^#" curr_month=`date '+%m` curr_day=`date '+%d` curr_year=`date '+%Y` #curr_month=02... (7 Replies)
Discussion started by: newbie_01
7 Replies

2. Shell Programming and Scripting

Echo a colored text with tabs

I have the line below to echo values with tab between them. The text is also colored, however, some\t does not work. The output of this one below will have the first two \t not working. echo "\033}\t$time\t$end\t$day\t$score\033 This one below will have all the \t working but will also... (4 Replies)
Discussion started by: erin00
4 Replies

3. Shell Programming and Scripting

[Solved] Insert tabs as delimiter

Hello all, I have an unstructured file with space as delimiter , which I want to structure. The output file should actually have only 5 columns with tab as delimiter. The 4th column can have only 3 values ( biological_process , cellular_component , molecular_function ) Here is how the... (12 Replies)
Discussion started by: ritakadm
12 Replies

4. Shell Programming and Scripting

How do I insert text with sed ?

Hi I was wondering if anyone new of a solution to this problem? I need to copy a time stamp that is on a line of .text in a text file into multiple positions on the same line. I need to insert the time stamp on the same line between every occurance of the text ".pdf_.html" right after the... (9 Replies)
Discussion started by: Paul Walker
9 Replies

5. Shell Programming and Scripting

How to insert text after a block of text?

Input: fstab is a configuration file that contains information of all the partitions and storage devices in your computer. The file is located under /etc, so the full path to this file is /etc/fstab. The >>>>> characters would be replaced by some texts. For example if i run a... (5 Replies)
Discussion started by: cola
5 Replies

6. Web Development

How to indent the second line of text in html?

Hi, I have 3 lines in a text and i want to indent the 2nd line of the text. How can i do that in html? Here is the text. 1: XYZ. 2009 Jul 14. Perl is a scripting language. Perl is a high-level, general-purpose, interpreted, dynamic programming language ID: 2547999 The output... (1 Reply)
Discussion started by: vanitham
1 Replies

7. Shell Programming and Scripting

Help with replacing tabs inside "" with some text/blank

I am poor with scripting;) I have a file in the following format; 'This is a "test in production" of importance.' I want to get rid of the spaces inside the "" part only to get the output as, 'This is a "testinproduction" of importance.' (1 Reply)
Discussion started by: shmathew
1 Replies

8. Shell Programming and Scripting

Need to insert new text and change existing text in a file using SED

Hi all, I need to insert new text and change existing text in a file. For that I used the below line in the command line and got the expected output. sed '$a\ hi... ' shell > shell1 But I face problem when using the same in script. It is throwing the error as, sed: command garbled:... (4 Replies)
Discussion started by: iamgeethuj
4 Replies

9. Shell Programming and Scripting

How to insert some constant text at beginig of each line within a text file.

Dear Folks :), I am new to UNIX scripting and I do not know how can I insert some text in the first column of a UNIX text file at command promtp. I can do this in vi editor by using this command :g/^/s//BBB_ e,g I have a file named as Test.dat and it containins below text: michal... (4 Replies)
Discussion started by: Muhammad Afzal
4 Replies

10. Shell Programming and Scripting

sh: Inserting tabs and moving text to 1 line

I trying to extract certain text from a csv file and then placing it into another csv file, but having problems getting the data to placed in one line with tab separated fields. Basically would like to have text sent to interfaces.csv in one line seperated by tabs. As it currently places files... (6 Replies)
Discussion started by: 00000008
6 Replies
Login or Register to Ask a Question

Featured Tech Videos