Для прикола, вот Руби
ruby -e '
data = File.readlines(ARGV.shift)
.map {|line| line.split.map(&:to_i)}
.transpose
.map {|(a,b)| (a==0 && b==0) ? [9,9] : [a,b]}
.transpose
.each {|row| puts row.join(" ")}
' file
1 9 9 9 9 9 9 9 9 9 1 2 1
0 9 9 9 9 9 9 9 9 9 0 0 0
Для замены всех файлов:
ruby -e '
require "tempfile"
require "pathname"
Pathname.new("/path/to/your/files/").each_child do |pathname|
next unless pathname.file?
temp = Tempfile.new(pathname.basename.to_s)
filename = pathname.to_s
File.readlines(filename)
.map {|line| line.split.map(&:to_i)}
.transpose
.map {|(a,b)| (a==0 && b==0) ? [9,9] : [a,b]}
.transpose
.each {|row| temp.puts row.join(" ")}
temp.close
File.link filename, filename+".bak"
File.rename temp.path, filename
end
'
Использование GNU awk
gawk '
{
grp = 0
# see if any of these words already have a group
for (i=1; i<=NF; i++) {
if (group[$i]) {
grp = group[$i]
break
}
}
# no words have been seen before: new group
if (!grp) {
grp = ++n
}
# if we have not seen this word, add it to the output
for (i=1; i<=NF; i++) {
if (!group[$i]) {
line[grp] = line[grp] $i OFS
}
group[$i] = grp
}
}
END {
PROCINFO["sorted_in"] = "@ind_num_asc"
for (n in line) {
print line[n]
}
}
' input.file
С первым входом:
AMAZON NILE ALASKA MANGROVE
HELLO MY NAME IS
При подключении второго входа (выхода кcolumn -t
):
apple_bin2file strawberry_24files
mango2files strawberry_39files apple_bin8file
dastool_bin6files strawberry_40files apple_bin6file
orange_bin004file dastool_bin004files
orange_bin005file dastool_bin005files
apple_bin3file dastool_bin3files
apple_bin5file dastool_bin5files
apple_bin7file dastool_bin7files
Для именно вашего примера попробуйте
awk '
{for (j=1; j<=MX; j++) {for (i=1; i<=NF && !(m=match (LN[j], $i)); i++);
if (m) {$i = ""
break
}
}
LN[j] = LN[j] $0 " "
if (j>MX) MX = j
}
END {for (l in LN) print LN[l]
}
' file3
AMAZON NILE ALASKA MANGROVE
HELLO MY NAME IS
РЕДАКТИРОВАТЬ :с новыми данными это должно работать:
awk '
{for (j=1; j<=MX; j++) {m = 0
for (i=1; i<=NF; i++) {if (match (LN[j], $i)) {$i = ""
m = 1
}
}
if (m) break
}
LN[j] = LN[j] $0 OFS
if (j>MX) MX = j
}
END {for (l in LN) {gsub (/ +/, OFS, LN[l])
gsub (OFS"+", OFS, LN[l])
print LN[l]
}
}
' OFS="\t" file