Tentarei responder a sua solicitação passo a passo. Apenas assuma aqui que input
é uma linha do seu arquivo de entrada:
Extraindo o número da coluna do primeiro caractere "R"
Este é um trabalho bastante simples para awk
:
awk '{for (i=1; i<=NF; i++) { if($i == "R") { print i - 3; exit} } }' < input
Considerando como você está computando sua data, estou assumindo que o 'R' não pode estar na primeira linha (caso contrário, o número do dia poderia ser 0).
Extraindo valores da 1ª e 2ª coluna
Isso é ainda mais simples:
awk '{print $1}' < input # for first column
awk '{print $2}' < input # for second column
Construindo saída
No caso de o comando retornar True
:
sed 's/ R / L /' < input
No caso de o comando retornar False
:
awk '{
afterR=0;
for (i=1; i<=NF; i++){
if ($i == "R") {
$i = "F";
afterR=1;
}
if (afterR == 1 && $i == "O") {
$i = "F"
}
}
print $0
}' < input
Colocando tudo junto
Embora isso seja desaprovado, não vejo como evitar loops em suas linhas de entrada, já que você precisa executar um comando muito específico para cada linha. Esteja ciente de que, para arquivos grandes, isso pode me tornar super lento. Como o seu script pode parecer com todos esses elementos:
while read line;
do
date="%m/d$(echo $line | awk '{for (i=1; i<=NF; i++) { if($i == "R") { print i - 3; exit} } }')/%Y"
result=$(./bpimagelist -client "$(echo $line | awk '{print $1}')" -policy "$(echo $line | awk '{print $2}')" -hoursago 100000 -U | awk -v date="$date" '$1 == date' | wc -l)
if [[ $result -ne 0 ]];
then
echo $line | sed 's/ R / L /'
else
echo $line | awk '{
afterR=0;
for (i=1; i<=NF; i++){
if ($i == "R") {
$i = "F";
afterR=1;
}
if (afterR == 1 && $i == "O") {
$i = "F"
}
}
print $0
}'
fi
done < myinputfile.txt