When I collapsed the script into a one-liner

Why would you do that? Copy-paste the script in a file with a meaningful name. Then turn that file executable (e.g., using your file manager or with 'chmod +x').

it would start ... but nothing ensued for about ten minutes.

It works in less than 0.1 s on the three files you gave in the original post.

awk '{print FILENAME,"\t",$0}'

That prints the file name followed by a space, a tab, another space and the original line. I doubt it is what you want. Also, the tiny AWK program I proposed changed the order of the fields so that there the join field is first and no option needs to alter the default behavior of 'join'.

>> Can't you write *.txt?!
FILENAME has specific meaning in awk, so I was sure that I would be getting that for which I was asking.

I am talking about the arguments given to awk: 01.txt 02.txt 03.txt 04.txt 05.txt 06.txt 07.txt 08.txt 09.txt 10.txt 11.txt 12.txt 13.txt 14.txt 15.txt 16.txt 17.txt 18.txt 19.txt 20.txt 21.txt 22.txt 23.txt 24.txt 25.txt 26.txt 27.txt 28.txt 29.txt 30.txt 31.txt 32.txt 33.txt 34.txt 35.txt 36.txt 37.txt 38.txt 39.txt 40.txt 41.txt 42.txt 43.txt 44.txt. Typing that is a waste of time and is prone to error.

Also, if, in my previous post, I have understood what you wanted to do with Leafpad and 43 manual executions (i.e., "join every file with the union of all other files"), here is a slightly modified script that does everything in one single execution:

#!/bin/sh
if [ -z "$2" ]
then
    printf "Usage: $0 file1 file2 [file3 ...]
"
    exit
fi
TMP=$(mktemp -u)
trap "rm $TMP 2>/dev/null" 0
mkfifo $TMP
for searched in "$@"
do
    shift
    cut -f 2 "$searched" | sort > $TMP &
awk '{ print $2, $1, FILENAME }' "$@" | sort -k 1,1 | join - $TMP > "$searched-joins"
    set "$@" "$searched"
done

Again: if you want to reorder the fields and change the spaces into tabs, you can pipe the output of every join to something like:
awk '{ print $2 "\t" $1 "\t" $3 }'

Notice the absence of commas (which would insert OFS, a space by default).

Reply via email to