Temukan kolom duplikat dan pisahkan ke file atau variabel (Bash)

1

Saya memiliki output seperti; (Kolom dipisahkan oleh tab \t)

name1   something1
name1   something2
name1   something3
name2   something4
name2   something5

Untuk output ini saya butuh dua output (jika ada name3, saya akan membutuhkan 3 output) seperti

name1   something1
name1   something2
name1   something3

dan

name2   something4
name2   something5

Saya pikir ini akan dilakukan oleh AWK tetapi saya tidak bisa membuat kata-kata ajaib.

Apa cara terbaik untuk melakukan ini?

Saya memerlukan syarat untuk membaca $1"1. kolom" dan mencetak semuanya (tidak menghapus duplikat) kecuali itu akan berubah dan mencetak kolom lainnya ($ 2, $ 3, ...)

Saya pikir menggunakan loop itu mencetak output pertama dan seterusnya.

makgun
sumber

Jawaban:

2

Coba ini:

awk -F'\t' '{print>$1;}' file

Ketika perintah di atas selesai, akan ada dua file lagi di direktori:

$ cat name1
name1   something1
name1   something2
name1   something3
$ cat name2
name2   something4
name2   something5

Bagaimana itu bekerja

  • -F'\t'

    Ini memberitahu awk untuk menggunakan tab sebagai pemisah bidang.

  • print>$1

    Ini memberitahu awk untuk mencetak setiap baris ke file bernama setelah bidang pertama.

Menghapus karakter ilegal dari nama file

Misalkan file input terlihat seperti:

$ cat file
name/1  something1
name/1  something2
name/1  something3
name/2  something4
name/2  something5

Kode berikut membuat file berdasarkan bidang nama tetapi dengan /dihapus:

awk -F'\t' '{name=$1; gsub(/[/]/, "", name); print>name;}' file

Di atas diuji pada GNU awk dan berjalan dengan sukses. Jika pria Anda tidak menerima, cobalah:

awk -F'\t' '{name=$1; gsub("/", "", name); print>name;}' file

atau:

awk -F'\t' '{name=$1; gsub(/\//, "", name); print>name;}' file
John1024
sumber
1
lol itu elegan!
theoden
AWK tidak dapat membuka "name1" untuk keluaran? Itu tidak akan membuat file?
makgun
@ Bakgun Itu kemungkinan berarti bahwa perintah sedang dijalankan di direktori yang Anda tidak memiliki izin menulis . Sebelum menjalankan perintah, cdke direktori yang Anda miliki.
John1024
Saya berada di $ HOME di bash-shell
makgun
Penyebab masalah untuk meta charecters yang tidak diizinkan oleh sistem untuk dinamai file seperti: /
makgun
0

Saya pikir ini harus berhasil:

mkdir tmp; cd tmp
while IFS= read line; do
    echo "$line" >> $(echo "$line" | awk '{print $1}')
done
cat *

Ini membaca input baris demi baris dan menambahkan setiap baris sesuai dengan argumen pertamanya.

Jika Anda ingin mengalirkannya ke variabel:

while IFS= read line; do
    key="$(echo "$line" | awk '{print $1}')"
    eval "INPUT_$key='\$INPUT_$key\$line'"
done

Jika Anda memiliki tuntutan besar darinya, gunakan:

#!/usr/bin/python

import sys
import re

for line in sys.stdin:
    f = open(re.split("\s+", line, 1), 'a')
    f.write(line)
    f.close()

Ini akan bekerja Harus. Tidak mungkin gagal.

theoden
sumber
Dengan ini, hanya mencetak $ 1 dan tidak akan menemukan baris terakhir jika itu berubah
makgun
@akgun, itu akan, jika Anda menekan enter.
theoden
Saya membuat skrip bash dan menambahkan ini ke file dengan menambahkan < <(cat $file)setelah donetetapi tidak berhasil
makgun
@makgun, jika Anda berencana untuk menggunakan semua jenis karakter di semua platform, jangan gunakan bash/ awk/ gawk/ etc, gunakan perl/ python.
theoden
Saya tidak tahu bagaimana phyton bekerja dan saya perlu mengubah semua perintah sebelumnya untuk mendapatkan ini output pertama saya
makgun