Bash - obróbka plików

0

Witam,
mam 60 plików. W każdym są 4 kolumny danych po 100 wyników. Chce z każdego tego pliku wyciąć tylko pierwszą kolumnę danych i złożyć to w jeden plik. Napisałem taki skrypcik:

#!/bin/sh

for i in `seq 1 60`
do
	cut -f1 -d '	' $i.txt  >> wynik.txt
done

Działa, nie do końca tak jak chce. W pliku wynik.txt wycięte pierwsze kolumny nie ustawiają mi się jako kolejne kolumny tylko jako zbitka danych jedna pod drugą. Po wklejeniu do exela nie mogę tego dalej obrabiać bo wkleja mi się wszystko do jednej kolumny.

Jak to zrobić żeby dane się zapisały kolumna obok kolumny?

Pokazuję o co chodzi, przykładowy plik z danymi i plik wynikowy.

0

Ciekawe, bo u mnie działa :). Sprawdź w czymś innym niż notatnik, bo pewnie to brakujące Windowswe \r

0
nalik napisał(a):

Ciekawe, bo u mnie działa :). Sprawdź w czymś innym niż notatnik, bo pewnie to brakujące Windowswe \r

Wyświetla Ci się kolumna obok kolumny czy kolumna pod kolumną?

Załączam dwa przykładowe pliki danych na których możesz spróbować.

1
  1. Wiesz czym różni się CRLF ("\r\n") of LF ("\n")? Proszę otwórz te pliki w czymś innym niż notatnik :) Polecam visual studio code.
  2. W tych plikach znakiem oddzielającym jest tab. cut używa tab domyślnie. Wiec zmiast cut -f1 -d ' ' $i.txt >> wynik.txt zrób cut -f1 $i.txt >> wynik.txt albo cut -f1 -d$'\t' $i.txt
0

@Daniel Zrąbkowski pokaż na przykładowe wejście i jakie ma być przykładowe wyjście, bo chyba się z @nalik nie rozumiecie.

1

Jednak się nie zrozumieliśmy. Spróbuj tak

#!/bin/sh

for i in {1..60}
do
    cut -f1 -d $'\t' $i.txt  | tr $'\n' ' ' >> wynik.txt
    echo "" >> result.txt
done

Zostaje tylko kwestia śmieci z pierwszych linijek.

Ewentualnie taki potworek:

#!/bin/sh

process=\
'BEGIN { FS = "\t" }
NR > 1 {
    for (col = 1; col <= NF; col++) {
        if (col == 1 && length($col) > 1) {
            printf "%s\t", $col
        }
    }
}'

for i in {1..60}
do
    awk "$process" $i.txt >> result.txt
    echo "" >> result.txt
done

Edit:
To jest krótsze od drugiego przykładu i też zadziała:

for i in {1..60}
do
    awk -F $'\t' 'NR > 1 && NF > 1 { printf "%s\t", $1 }' $i.txt >> result.txt
    echo "" >> result.txt
done
0

Może narzędzie dedykowane do TSV/CSV Ci pomoże: https://github.com/BurntSushi/xsv/blob/master/README.md

1
> ls
1.txt  2.txt
> awk 'FNR > 3 { a[FNR-3] = a[FNR-3] $1 "\t" }; END { for (i = 1; i <= 100; ++i) print a[i] }' *.txt
-4,5943 -1,8132
-4,5943 -1,7979
-4,6045 -1,8285
-4,5994 -1,8081
-4,5968 -1,8259
...
> 
0
nalik napisał(a):

Edit:
To jest krótsze od drugiego przykładu i też zadziała:

for i in {1..60}
do
    awk -F $'\t' 'NR > 1 && NF > 1 { printf "%s\t", $1 }' $i.txt >> result.txt
    echo "" >> result.txt
done

Jesteś genialny! O to właśnie mi chodziło. Dziękuję Ci bardzo :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1