perl -F, -lane '
exists $h{$F[0]} or $h[$h{$F[0]}=@h]=$_;
$h=$_; /,false$/ or $_=$h for $h[$h{$F[0]}];
END{ print for @h; }
' duplicates.file
โครงสร้างข้อมูล:
- แฮช
%h
ที่มีคีย์คือฟิลด์แรก (AAA, BBB, CCC ฯลฯ ) และค่าที่เกี่ยวข้องคือตัวเลขที่บอกลำดับที่พบคีย์ ดังนั้นเช่นคีย์ AAA => 0, คีย์ BBB => 1, คีย์ CCC => 2
- Array
@h
ที่มีองค์ประกอบคือเส้นที่มีอยู่ในลำดับการพิมพ์ ดังนั้นหากพบทั้งข้อมูลจริงและเท็จค่าเท็จจะเข้าไปในอาร์เรย์ OTW หากมีข้อมูลประเภทใดประเภทหนึ่งก็จะมีอยู่
อีกวิธีคือใช้ GNU sed:
sed -Ee '
G
/^([^,]*),(false|true)\n(.*\n)?\1,\2(\n|$)/ba
/^([^,]*)(,true)\n(.*\n)?\1,false(\n|$)/ba
/^([^,]*)(,false)\n((.*\n)?)\1,true(\n|$)/{
s//\3\1\2\5/;h;ba
}
s/([^\n]*)\n(.*)$/\2\n\1/;s/^\n*//
h;:a;$!d;g
' duplicates.file
FWIW, โค้ดเทียบเท่า POSIX สำหรับโค้ด GNU-sed ด้านบนแสดงอยู่ด้านล่าง:
sed -e '
G
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false$/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false\n/ba
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true$/{
s//\3\1\2/
h
ba
}
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true\n/{
s//\3\1\2\n/
h
ba
}
y/\n_/_\n/
s/\([^_]*\)_\(.*\)$/\2_\1/;s/^_*//
y/\n_/_\n/
h;:a;$!d;g
' duplicates.file
คำอธิบาย
- ในวิธีนี้เราจะเก็บผลลัพธ์ที่จะพิมพ์ในพื้นที่พักไว้
- สำหรับการอ่านทุกบรรทัดเราจะต่อท้ายพื้นที่พักไว้กับพื้นที่รูปแบบสำหรับการตรวจสอบของบรรทัดปัจจุบันเผชิญหน้ากับสถานะปัจจุบันของพื้นที่พัก
- ตอนนี้ 5 สิ่งที่อาจเกิดขึ้นระหว่างการเปรียบเทียบนี้:
- a) บรรทัดปัจจุบันตรงกับที่ใดที่หนึ่งในสายพัก & false: false
- [การกระทำ] เนื่องจากพบสถานะเท็จเดียวกันจากนั้นจึงไม่ทำอะไรเลย
- b) บรรทัดปัจจุบันตรงกับที่ใดที่หนึ่งในบรรทัดที่พักไว้ & จริง: จริง
- [การกระทำ] เนื่องจากพบสภาพที่แท้จริงเหมือนกันดังนั้นอย่าทำอะไรเลย
- c) บรรทัดปัจจุบันตรงกับที่ใดที่หนึ่งในบรรทัดที่พักไว้ & true: false
- [การกระทำ] เนื่องจากสถานะเท็จมีอยู่แล้วไม่ต้องทำอะไรเลย
- d) บรรทัดปัจจุบันตรงกับที่ใดที่หนึ่งในบรรทัดที่พักไว้ & false: จริง
- [การดำเนินการ] สิ่งนี้เกี่ยวข้องกับงานบางอย่างเนื่องจากเราจำเป็นต้องแทนที่สายปลอมในตำแหน่งเดียวกันกับที่ตั้งของจริง
- e) สายปัจจุบันไม่ตรงกับที่ใดก็ได้ในสายพัก
- [การกระทำ] ย้ายบรรทัดปัจจุบันไปยังจุดสิ้นสุด
ผล
AA,false
BB,false
CC,false
DD,true
true
ว่ามันเป็นอินสแตนซ์แรกของคอลัมน์แรกหรือไม่