Puncte:1

Cum să înlocuiți șirurile din ultimele n linii ale mai multor fișiere în Linux

drapel vu

Cum pot înlocui șiruri în să spunem „ultimele 10 rânduri” din mai multe fișiere?

Am aproximativ 100 de fișiere cu aceeași extensie „.txt” și aș dori să înlocuiesc șirul „GLN” cu „LOO” în ultimele 10 rânduri ale fiecărui fișier. Cum pot face acest lucru? Știu cum să o fac pentru un fișier, dar nu pentru mai multe fișiere. Când folosesc această comandă;

pentru i în `head -3 *.txt | awk '{print $4}''
     do
                   sed -i 's/GLN/LOO/g' *.txt 
     Terminat

Acesta înlocuiește GLN oriunde apare în fișiere și nu doar ultimele 10 rânduri. Te rog, cu ce greșesc?

Puncte:2
drapel hr

Nu este clar ce cap -3 *.txt | awk „{printează $4}” revine aici deoarece nu ne-ați arătat totuși o mostră din fișierele dvs sed -i 's/GLN/LOO/g' *.txt voi inlocui toate instanțele GLN în toate liniile in toate fișierele care se potrivesc *.TXT, cu condiția ca bucla să se execute cel puțin o dată.

AFAIK nu există nicio modalitate directă de a aborda ultimul n linii ale unui fișier în sed - deci pentru a utiliza asta, ar trebui să calculați offset-ul extern, folosind wc -l și aritmetica shell, de exemplu:

pentru f în *.txt; do 
  start=$(( $(wc -l <"$f") - 9 ))
  sed "$start"',$s/GLN/LOO/g' "$f"
Terminat

(am eliminat -i deci ieșirea merge la terminal, pentru testare). Ai putea folosi ceva de genul awk „END{print NR-9}” „$f” in locul $(( $(wc -l <"$f") - 9 )) pentru a obține compensarea de pornire dacă intenția ta a fost să folosești awk.

Alternativ ai putea folosi tac pentru a inversa fișierul și a face înlocuiri în primul n linii, atunci tac rezultatul - deși asta face înlocuirea pe loc complicată.

În această situație, probabil că aș ajunge la ed sau ex care suportă decalaje numerice de adrese, ex. testare cu ieșire către terminal:

pentru f în *.txt; do 
  printf '%s\n' '$-9,$s/GLN/LOO/g' ',p' | ed -s „$f”
Terminat

Odată ce ești fericit că face ceea ce trebuie, schimbă-te ,p la wq la wscrieți rezultatul în fișier (echivalentul lui sed -i).

Puncte:1
drapel cn

Aș folosi funcțiile tac și awk pentru acest job, după cum urmează:

tac file1.txt | awk 'NR<11 {gsub("GLN","LOO"};{printare}' | tac

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.