awk  BEGIN{print "result1 result2  result3"} 'BEGIN{RS=","}{$1=$1}1' input.txt

result1 result2  result3
abc1    def1     ghi1 lmn1 opq1 rst1 abc2    def2     ghi2 lmn2 opq2 rst2

Powyżej awk drukuje wszystkie wartości w jednym rzędzie i musi wydrukować wyjście w innym wierszu. ABC1 Def1 GHI1 LMN1 OPQ1 RST1 w jednym rzędzie i ABC2 Def2 GHI2 LMN2 OPQ2 RST2 w innym wierszu. Liczba słów nie jest ustalona na linię (może być 3 słowa lub więcej niż 3 słowa)

Input.txt:

abc1
def1
ghi1 lmn1 opq1 rst1

abc2
def2
ghi2 lmn2 opq2 rst2

Oczekiwany wynik:

result1 result2  result3
abc1    def1     ghi1 lmn1 opq1 rst1
abc2    def2     ghi2 lmn2 opq2 rst2
awk
1
spiderman 5 czerwiec 2018, 03:46

3 odpowiedzi

Najlepsza odpowiedź

edytuj: Ponieważ OP zmienił się tutaj, więc także zmieniając kod tutaj.

awk '
BEGIN{
  print "result1","result2","result3"}
NF{
  count++;val=val?val OFS $0:$0}
NF && count==3{
  print val;
  val=""}
END{
  if(val){
    print val}
}' OFS="\t"  Input_file

Wynik będzie następujący.

result1 result2 result3
abc1    def1    ghi1 lmn1 opq1 rst1
abc2    def2    ghi2 lmn2 opq2 rst2

Poniżej może Ci pomóc.

echo "result1 result2  result3";xargs -n 3 < Input_file | column -t
0
RavinderSingh13 6 czerwiec 2018, 03:22

Jeśli Twoje rekordy są oddzielone przez więcej pustych linii, możesz to zrobić zamiast tego

$ awk -v RS= 'BEGIN {print "result1","result2","result3"} 
                    {$1=$1}1' file | column -t

result1  result2  result3
abc1     def1     ghi1
abc2     def2     ghi2
1
karakfa 5 czerwiec 2018, 02:04
$ cat tst.awk
BEGIN { RS="" }
NR==1 {
    for (i=1; i<=NF; i++) {
        printf "result%d%s", i, (i<NF ? OFS : ORS)
    }
}
{
    $1 = $1
    print
}

$ awk -f tst.awk file | column -t
result1  result2  result3
abc1     def1     ghi1
abc2     def2     ghi2
0
Ed Morton 5 czerwiec 2018, 03:44