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.

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.