Merge column file


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Merge column file
# 8  
Old 01-13-2015
Quote:
Originally Posted by aav1307
Very fine

Thanks you

---------- Post updated at 07:20 AM ---------- Previous update was at 05:49 AM ----------

Thaks so much Don Cragun,

Just like this, excelent, one finally question, how I can generality you code for many colums so,

... ... ...
Did you try changing $1 in both places in my script to $0 as I suggested in my post with that script if you wanted to preserve spaces in your input files?

If that didn't work, please show us the output my script produced after that change (in CODE tags) and clearly specify what needs to be done differently.
# 9  
Old 01-15-2015
Lightbulb

Here is a general merge
Code:
#!/bin/sh
while     
 read line2 <&4
 e2=$?
 read line1 <&3 || [ $e2 -eq 0 ]
do
 if [ -z "$line1" ]
 then
  while read line2 <&4 && [ -n "$line2" ]
  do
   printf "%s\n" "$line2"
  done 
 elif [ -z "$line2" ]
 then
  while read line1 <&3 && [ -n "$line1" ]
  do
   printf "%s\n" "$line1"
  done 
 fi
 printf "%s\n" "$line1 $line2"
done 3<file1 4<file2

This User Gave Thanks to MadeInGermany For This Post:
# 10  
Old 01-15-2015
Nice!

But - two lines are missing, the ones that would be first to be printed alone.

And, if you reverse the order of the files, you get
Code:
111 aaa
222 bbb
ddd
eee
fff
 
333 ggg
444 hhh
jjj

If you printed $line2 prefixed by a <TAB>, like printf "\t%s\n" "$line2" and printf "%s\t%s\n" "$line1" "$line2" , result were
Code:
111    aaa
222    bbb
       ddd
       eee
       fff
    
333    ggg
444    hhh
       jjj

Try this corrected version of MadeInGermany's proposal:
Code:
while   read line2 <&4
        e2=$?
        read line1 <&3 || [ $e2 -eq 0 ]
   do   if [ -z "$line1" ]
          then  printf "\t%s\n" "$line2" 
                while read line2 <&4 && [ -n "$line2" ]
                   do printf "\t%s\n" "$line2"   
                   done
        elif [ -z "$line2" ]  
          then  printf "%s\n" "$line1"
                while read line1 <&3 && [ -n "$line1" ]
                   do   printf "%s\n" "$line1"
                   done
        fi
        printf "%s\t%s\n" "$line1" "$line2"
   done 3<file1 4<file2
aaa    111
bbb    222
ccc
ddd
eee
fff
    
ggg    333
hhh    444
iii
jjj

Still open: correction for done 3<file1 4<file1

Last edited by RudiC; 01-15-2015 at 02:09 PM..
These 2 Users Gave Thanks to RudiC For This Post:
# 11  
Old 01-15-2015
Indeed the output was not exact, and one line was even left out.
Here is another fix:
Code:
while     
 read line2 <&4
 e2=$?
 read line1 <&3 || [ $e2 -eq 0 ]
do
 if [ -z "$line1" ] && [ -n "$line2" ]
 then
  while
   printf "\t%s\n" "$line2"
   read line2 <&4 && [ -n "$line2" ]
  do :
  done 
 elif [ -z "$line2" ] && [ -n "$line1" ]
 then
  while
   printf "%s\n" "$line1"
   read line1 <&3 && [ -n "$line1" ]
  do :
  done
 fi
 printf "%s\t%s\n" "$line1" "$line2"
done 3<file1 4<file2

Here the printf is moved to the while, again using the "list" feature of while (takes the exit status of the last command).
An empty loop causes an error, therefore the :.
In effect it emulates a repeat-until (or do-until) loop.

Last edited by MadeInGermany; 01-15-2015 at 03:07 PM.. Reason: Added fix for file1 file1
These 3 Users Gave Thanks to MadeInGermany For This Post:
# 12  
Old 01-15-2015
appreciate the repeat - until!
This User Gave Thanks to RudiC For This Post:
# 13  
Old 01-15-2015
Hello,
For and only for fun, another way in bash and with paste:
Code:
unset B C
F() { [ ${#2} -eq 1 ] && ((X++)) || B[$X]=${B[$X]}$2 ; }; X=1 ; mapfile -c 1 -C 'F' <file2
F() { [ ${#2} -eq 1 ] && ((X++)) || C[$X]=${C[$X]}$2 ; }; X=1 ; mapfile -c 1 -C 'F' <file1
[ ${#B[@]} -le ${#C[@]} ] && Y=${#C[@]} || Y=${#B[@]}
X=1;while [ $X -le $Y ] ; do paste <(echo -n "${B[$X]}") <(echo -n "${C[$X]}") ; ((X++)) ; echo ;done

Beware, this method load files in memory.
Regards.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Cut specific column from 2 file and merge

Hi ALL, I have two file. I need to combine these two file based on a layout. I used the below code and able to extract the record. But now able to insert that to a 3'rd file in between the extract FILE 1 CAID NUMBER 1-20 TID NUMBER 21-22 LABEL CHAR 23-44 BASE 45-60... (5 Replies)
Discussion started by: arunkumar_mca
5 Replies

2. Shell Programming and Scripting

Seperated by columns, merge in a file, sort them on common column

Hi All, I have 4 files in below format. I took them as an example. File 1: Cut from position 1-4 then 6-7 then 8-14 then rest left and make them as columns in one new file. Inserting character H to the initial of all line like HCTOT. CTOT 456787897 Low fever CTOR 556712345 High fever... (2 Replies)
Discussion started by: Mannu2525
2 Replies

3. Shell Programming and Scripting

Multiple file merge by column

Hello all, I am quite new in linux shell scripting and I have this issue. I ve got some files including measurements taken every 10minutes for a whole day. File name format is: 00.00, 00.10, 00.20,....23.50 File structure is: x | y | temperature x and y is the same in all files (same... (12 Replies)
Discussion started by: atzounis
12 Replies

4. Shell Programming and Scripting

Merge with common column

hi i have two files and i wanted to join them using common column. try to do this using "join" command but that did not help. File 1: 123 9a.vcf hy92.vcf hy90.vcf Index Ref Alt Ref Alt Ref Alt 315 14 0 7 4 ... (6 Replies)
Discussion started by: empyrean
6 Replies

5. Shell Programming and Scripting

column merge same value

Dear All, I have the following file: file1 "1" 189218400 189221399 3000 "0041 ENSMUSG00000000031" "0041" "+" "ENSMUSG00000000031" 189039418 189175306 "downstream" 178982 43094 "NearestStart" "1" 197067200 197068353 1154 "0057... (3 Replies)
Discussion started by: paolo.kunder
3 Replies

6. Shell Programming and Scripting

Merge CSV files and create a column with the filename from the original file

Hello everyone!! I am not completely new to shell script but I havent been able to find the answer to my problem and I'm sure there are some smart brains here up for the challenge :D. I have several CSV files that I need to combine into one, but I also need to know where each row came from.... (7 Replies)
Discussion started by: fransanchezoria
7 Replies

7. Shell Programming and Scripting

Help with merge two file based on similar column content

Input file 1: A1BG A1BG A1BG A1CF A1CF BCAS BCAS A2LD1 A2M A2M HAT . . Input file 2: A1BG All A1CF TEMP (5 Replies)
Discussion started by: perl_beginner
5 Replies

8. Shell Programming and Scripting

merge two two txt files into one file based on one column

Hi, I have file1.txt and file2.txt and would like to create file3.txt based on one column in UNIX Eg: file1.txt 17328756,0000786623.pdf,0000786623 20115537,0000793892.pdf,0000793892 file2.txt 12521_74_4.zip,0000786623.pdf 12521_15_5.zip,0000793892.pdf Desired Output ... (5 Replies)
Discussion started by: techmoris
5 Replies

9. Shell Programming and Scripting

Merge Two Files based on First column

Hi, I need to join two files based on first column of both files.If first column of first file matches with the first column of second file, then the lines should be merged together and go for next line to check. It is something like: File one: 110001 abc efd 110002 fgh dfg 110003 ... (10 Replies)
Discussion started by: apjneeraj
10 Replies

10. Shell Programming and Scripting

Column Merge?

Hi all, I need to join two columns from two different files file1.txt and file2.txt and append in a new file. Example : $cat file1.txt ABCD.ksh:010141 ABCD.ksh:010511 ABCD.ksh:010815 ABCD.ksh:011114 ABCD.ksh:011415 ABCD.ksh:011720 ABCD.ksh:012022 ABCD.ksh:012830 ABCD.ksh:014432... (5 Replies)
Discussion started by: sabyasm
5 Replies
Login or Register to Ask a Question